0

我想在另一行写 $1 进行替换;

my $converting_rules = +{
    '(.+?)' => '$1',
};

my $pre     = $converting_rule_key;
my $post    = $converting_rules->{$converting_rule_key};
#$path_file =~ s/$pre/$post/; // Bad... 
$path_file =~ s/$pre/$1/; // Good!

在 Bad 上,$1 被识别为字符串 '$1'。但我 wqnt 来对待它匹配的字符串。我不知道该怎么做...请帮助我!

4

2 回答 2

2

问题是s/$pre/$post/对变量$pre和进行插值$post,但不会递归地对其中看起来像变量的任何内容进行插值。所以你想eval在替换中添加一个额外的/ee标志:

$path_file =~ s/$pre/$post/ee;
于 2013-01-25T18:53:01.660 回答
0
$x = '$1.00';
print qq/$x/;

打印$1.00,所以毫不奇怪

$x = '$1.00';
s/(abc)/$x/;

用 代替$1.00

你所拥有的是一个模板,但你没有做任何事情来处理这个模板。String::Interpolate可以处理这样的模板。

use String::Interpolate qw( interpolate );
$rep = '$1';
s/$pat/ interpolate($rep) /e;
于 2013-01-25T19:13:19.773 回答