我无法找到解决方案,这让我疯狂!
my $foo = qr/(\S+) (\X+)/;
my $bar = qr/$2/;
line =~ s/$foo/$bar/g
我的问题是$bar
使用之前定义的$2
值,而不是(\X+)
。
答案 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;