変数内のバックスラッシュを置き換えるにはどうすればよいですか?
$string = 'a\cc\ee';
$re = 'a\\cc';
$rep = "Work";
#doesnt work in variable
$string =~ s/$re/$rep/og;
print $string."\n";
#work with String
$string =~ s/a\\cc/$rep/og;
print $string."\n";
出力:
a\cc\ee
Work\ee
これを正規表現の中で使用しているため、おそらくquotemeta()
or\Q
と andが必要です\E
(「 」を参照perldoc perlre
)
perl -E'say quotemeta( q[a/asf$#@ , d] )'
# prints: a\/asf\$\#\@\ \,\ d
# Or, with `\Q`, and `\E`
$string =~ s/\Q$re\E/$rep/og;
print $string."\n";
を設定すれば$re = 'a\cc';
動作します。バックスラッシュを変数として正規表現に含めると、期待どおりに補間されません。置換で文字通り使用されています。
代わりに、二重引用符で文字列を定義することもできますが、それは良い方法ではありません。コンテンツ内で何かを明示的に補間したい場合を除き、文字列では常に一重引用符を使用することをお勧めします。これにより、ごくわずかな量の処理が節約されますが、プログラマーが意図したことについて読者にヒントを与えることができます。
問題は、単一引用符を使用して定義していることです$re
。つまり、検索パターンで使用すると、2 つのスラッシュが検索されます。
単一引用符は、Perl に文字列を補間せず、代わりに生の文字を使用するように指示します。各スラッシュは文字どおりに、またエスケープとして使用されます。
比較:
$re0 = 'a\\cc';
$re1 = "a\\cc";
それらを印刷すると、次のように表示されます。
print $re0."\n".$re1."\n";
a\\cc
a\cc
一方、文字列を正規表現で直接使用すると補間されるため、エスケープとして機能するスラッシュが 1 つ必要で、エスケープするスラッシュがもう 1 つ必要です。