替换方法使用" $ 1"串?

时间:2015-11-24 06:21:36

标签: regex perl

my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/;
print $st,"\n";

如果您运行代码,则输出为' $1',但我希望看到' bc'。

$grep2不能直接放入正则表达式,因为输入值。

我该怎么做?

2 个答案:

答案 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问题的性质。