Regexp在Perl中搜索和替换为变量

时间:2011-02-08 06:30:27

标签: regex perl

我无法找到解决方案,这让我疯狂!

my $foo = qr/(\S+) (\X+)/;
my $bar = qr/$2/;

line =~ s/$foo/$bar/g 

我的问题是$bar使用之前定义的$2值,而不是(\X+)

3 个答案:

答案 0 :(得分:5)

请注意s的第二部分不是正则表达式,而是字符串来替换找到的正则表达式。你可以用这个来实现你想要的东西(最后注意ee双重评估选项):

my $foo = qr/(\S+) (\X+)/;
my $bar = '$2';             # no interpolation

$line =~ s/$foo/$bar/gee;   # first eval make $bar -> '$2', second replaces it 

答案 1 :(得分:1)

我认为$ bar的值应该只是一个字符串而不是正则表达式。 qr //看起来不正确。

答案 2 :(得分:0)

与bvr的建议类似,您可以使用子参考作为s///的替换方。这具有预编译的优点(子ref和替换),而不是为每个匹配重新编译。在大多数情况下,这将更快,更有可能在编译时捕获任何错误。

my $foo = qr/(\S+) (\X+)/;
my $bar = sub { $2 }; # or my $bar = \&some_replace_function;

$line =~ s/$foo/$bar->()/ge;