如何替换变量内的反斜杠?
$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
和\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
. 这意味着当您在搜索模式中使用它时,它会查找两个斜杠。
单引号告诉 Perl 不要插入字符串,而是使用原始字符。每个斜线都按字面意思理解,并作为一种逃避。
比较:
$re0 = 'a\\cc';
$re1 = "a\\cc";
当你打印出来时,你会看到:
print $re0."\n".$re1."\n";
a\\cc
a\cc
另一方面,当您直接在正则表达式中使用字符串时,它会被插值,因此您需要一个斜杠作为转义符,另一个作为您要转义的内容。