2011-02-08 15 views
2

解決策が見つからず、私を狂わせてしまいます。Regexp Perlで変数を検索し置換する

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

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

私の問題は$bar(\X+)ではなく$2の以前に定義された値を使用していることです。

答えて

5

sの2番目の部分は正規表現ではなく、正規表現を置き換える文字列であることに注意してください。

あなたが s///の交換側のためのサブ参照を使用することができますBVRの提案と同様に
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'など2番目の引数のために多くのことを試していましたが、私は最後にeeを持っていませんでした。 –

1

$ barの値は文字列で正規表現ではないはずです。 qr //は正しく表示されません。

0

:あなたは、この(最後にeeダブルevalのオプションに注意してください)と欲しいものを達成することができます。これは、各マッチのために再コンパイルされるのではなく、プリコンパイル(サブrefと置換の両方)されているという利点があります。ほとんどの場合、コンパイル時にエラーが発生する可能性が高くなります。

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

$line =~ s/$foo/$bar->()/ge; 
関連する問題