$test='abc="def"';
$replacement='$1="ghj"';
$test =~ s/(.+)="(.+)"/"$replacement/;
print $test;
それは印刷します:
$1=ghj
どうすれ$replacement
ば通訳として扱うことができますか?
$test='abc="def"';
$replacement='$1="ghj"';
$test =~ s/(.+)="(.+)"/"$replacement/;
print $test;
それは印刷します:
$1=ghj
どうすれ$replacement
ば通訳として扱うことができますか?
/e
正規表現に修飾子を追加します。正しく評価されるように、置換文字列も変更する必要があります。変数を補間するには、二重評価が必要です。
my $test='abc="def"';
my $replacement='"$1=ghj"';
$test =~ s/(.+)="(.+)"/$replacement/ee;
print $test;
出力:
abc=ghj
特に他の人があなたの交換品の価値に影響を与える可能性がある場合、これはやや危険であることに注意する必要があります。次に、システム上で任意のコードを実行できます。
この質問には約3つの答えがあります。
my $test = 'abc="def"';
my $replacement = sub { $1 . '="ghj"' };
$test =~ s/(.+)="(.+)"/$replacement->()/e;
print $test;
replace
関数の形式でカプセル化するモジュールがあります。Data::Munge:
use Data::Munge qw(replace);
my $test = 'abc="def"';
my $replacement = '$1="ghj"';
$test = replace $test, qr/(.+)="(.+)"/, $replacement;
print $test;
eval
。これは非効率的であるだけでなく、引用の問題($ replaceのすべてが構文的に有効なPerlであることを確認する必要があります)とセキュリティホール($ replaceが実行時に生成される場合、特に外部ソースからのものである場合)があります。私の最も嫌いなアプローチ:
my $test = 'abc="def"';
my $replacement = '$1 . "=\\"ghj\\""';
$test =~ s/(.+)="(.+)"/eval $replacement/e;
print $test;
(このs//eval $foo/e
部分は次のように書くこともできます。悪であり、すでにあるよりも隠されるべきではないs//$foo/ee
ので、私はそれをするのは好きではありません。)eval