my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/;
print $st,"\n";
如果您运行代码,则输出为' $1
',但我希望看到' bc
'。
$grep2
不能直接放入正则表达式,因为输入值。
我该怎么做?
答案 0 :(得分:4)
以下将做你想做的事:
use String::Substitution qw( sub_modify );
my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
sub_modify($st, $grep1, $grep2);
print $st,"\n";
此解决方案的优点是它不允许执行任意代码,例如eval EXPR
(aka /ee
)。
答案 1 :(得分:2)
在此特定上下文中的一个解决方案是使用/ e修饰符两次
#!/usr/bin/env perl
use strict;
use warnings;
my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/ee;
print $st,"\n";
输出:
bc
为了使它不那么脆弱,我建议将你的RHS用两套引号括起来:
$st =~ s/$grep1/qq{qq{$grep2}}/ee;
注意:正如ikegami所说,评估未经证实的输入是非常危险的。因此,我不会在一般情况下推荐这一点。此外,您可能有更好的解决方案,但您首先必须解开XY问题的性质。