2011-02-08 185 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;