如何替换变量中的反斜杠?
$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
答案 0 :(得分:9)
因为您在正则表达式中使用此内容 - 您可能需要quotemeta()
或\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";
答案 1 :(得分:2)
如果您设置$re = 'a\cc';
,则可以正常使用。当您将正则表达式作为变量包含在正则表达式中时,反斜杠不会像您期望的那样进行插值:它在字面上用于替换。
或者你可以用双引号定义字符串,但这不是一个好习惯。最好总是在字符串中使用单引号,除非您明确要在内容中插入内容 - 它会节省大量的处理,但这是读者对程序员所期望的内容的暗示。
答案 2 :(得分:0)
问题在于您使用单引号来定义$re
。这意味着当您在搜索模式中使用它时,它会查找两个斜杠。
单引号告诉Perl不要插入字符串,而是使用原始字符。每个斜线都是字面意思并作为逃避。
比较
$re0 = 'a\\cc';
$re1 = "a\\cc";
当你打印出来时,你会看到:
print $re0."\n".$re1."\n";
a\\cc
a\cc
另一方面,当你在正则表达式中直接使用字符串时,它是插值的,所以你需要一个斜杠作为转义,而另一个作为你逃脱的。