【发布时间】:2016-02-26 11:40:07
【问题描述】:
my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/;
print $st,"\n";
如果你运行代码,输出是'$1',但我想看到'bc'。
$grep2不能直接放入正则表达式,因为输入值。
我该怎么做?
【问题讨论】:
-
你也可以this way.
my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/;
print $st,"\n";
如果你运行代码,输出是'$1',但我想看到'bc'。
$grep2不能直接放入正则表达式,因为输入值。
我该怎么做?
【问题讨论】:
以下将做你想做的事:
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(又名/ee)那样执行任意代码。
【讨论】:
在这种特定情况下,一个解决方案是使用 /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 问题性质。
【讨论】:
my $grep2 = '[$1]'; 也失败了,我确信 OP 期望生成 [bc]。
my $grep2 = '[$1]';,但它会处理my $grep2 = '}$1{'; 失败。更重要的是,它同样危险,允许执行任意代码。