0

perl (s//) で置換テキストとして変数を使用したいですか? どうやら、次のコードは機能しません。私がやりたいことをする方法はありますか?

~$  ./subsuffix.pl 
xxx_$1_outsuffix.txt

subsuffix.pl :

#!/usr/bin/env perl

use strict;
use warnings;

my $filename="xxx_5p_insuffix.txt";
my $insuffix="_((5|3)p)_insuffix.txt";
my $outsuffix = '_$1_outsuffix.txt';

#result of the following is what I expect
#$filename =~ s/$insuffix$/_$1_outsuffix.txt/;
#But I want used a variable as the substitution text. 
#Unfortunately, the following do not work.
$filename =~ s/$insuffix$/$outsuffix/;
print "$filename\n";
4

3 に答える 3

4

通常、置換は評価されません。置換の最後にいくつかの/e's を追加し、引用符をいくつか追加して、最初の評価後に有効な式を維持する必要があります。

$filename =~ s/$insuffix$/qq("$outsuffix")/ee;
于 2013-04-04T15:52:24.147 に答える
3

修飾子を使用して/e、置換パターンを評価対象のコードとして扱うことができます。

$filename =~ s/$insuffix$/ "_" . $1 . "_outsuffix.txt" /e;
于 2013-04-04T15:57:58.867 に答える
2

あなたが持って$outsuffixいるのはテンプレートです。テンプレートは魔法のように自分自身を処理しません。プロセッサを呼び出す必要があります。String::Interpolateは、あなたのようなテンプレートを理解します。

use String::Interpolate qw( interpolate );

my $filename="xxx_5p_insuffix.txt";
my $insuffix="_((5|3)p)_insuffix.txt";
my $outsuffix = '_$1_outsuffix.txt';

$filename =~ s/$insuffix$/interpolate($outsuffix)/e;
print "$filename\n";
于 2013-04-04T17:50:25.873 に答える