$test='abc="def"';
$replacement='$1="ghj"';
$test =~ s/(.+)="(.+)"/"$replacement/;
print $test;
打印:
$1=ghj
如何处理$replacement
被解释?
答案 0 :(得分:6)
您将/e
修饰符添加到正则表达式中。您还需要修改替换字符串,以便正确评估它。插值变量需要双重评估。
my $test='abc="def"';
my $replacement='"$1=ghj"';
$test =~ s/(.+)="(.+)"/$replacement/ee;
print $test;
<强>输出:强>
abc=ghj
应该注意的是,这有些不安全,特别是如果其他人可能影响您的更换价值。然后他们可以在你的系统上执行任意代码。
答案 1 :(得分:4)
这个问题大约有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
'd。这不仅效率低,而且还充满引用问题(您必须确保$ replacement中的所有内容都是语法上有效的Perl)和安全漏洞(如果在运行时生成$ replacement,特别是如果它来自外部源)。我最不喜欢的方法:
my $test = 'abc="def"';
my $replacement = '$1 . "=\\"ghj\\""';
$test =~ s/(.+)="(.+)"/eval $replacement/e;
print $test;
(s//eval $foo/e
部分也可以写成s//$foo/ee
。我不喜欢这样做,因为eval
是邪恶的,不应该比现在更隐蔽。 )