2011-02-08 101 views
2

替换为变量,我无法找到一个解决方案,这和它的驾驶我疯了!正则表达式搜索,并在Perl

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

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

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

回答

5

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

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

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

谢谢,我为第二个参数尝试了很多东西,包括'\ 2','$ 2'等,我只是没有结束ee。 – 2011-02-08 07:02:11

1

我猜$酒吧的价值应该只是一个字符串,而不是一个正则表达式。 qr //看起来不正确。

0

到BVR的建议类似,你可以使用子REF为s///更换侧。这具有预编译(sub ref和替换)的优点,而不是为每个匹配重新编译。在大多数情况下,这会更快,更有可能在编译时捕获任何错误。

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

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