$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
'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
它是邪恶的,不应该比现在更隐蔽。)