我在使用s///
处理包含特殊字符的替换字符串时遇到了麻烦:
> cat replace.pl
use strict;
use warnings;
my $orig_string = 'abc${abc}def';
my $replacer = '${abc}';
my $replacement = 'TEXT';
print "\nBefore replacement: $orig_string";
$orig_string =~ s/$replacer/$replacement/g;
print "\nAfter replacement: $orig_string";
print "\n";
exit;
错误输出:
> /usr/bin/perl replace.pl
Before replacement: abc${abc}def
After replacement: abc${abc}def
如果我在$
中将$replacer
的{{1}}手动转义为my $replacer = '\${abc}';
,这将起作用,但是替换器在生产中将具有未知的数字和特殊字符集。
Perl版本:
> /usr/bin/perl -v
This is perl 5, version 16, subversion 3 (v5.16.3)
答案 0 :(得分:1)
您可以使用:
$orig_string =~ s/\Q$replacer\E/$replacement/g;
这将引用替换字符串,并将所有特殊的正则表达式元字符视为文字。
您还可以使用:
$replacer = quotemeta($replacer);
替换前。