在Perl中的变量中使用反斜杠替换文本

时间:2010-06-03 19:44:23

标签: regex string perl replace backslash

如何替换变量中的反斜杠?

$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

3 个答案:

答案 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

另一方面,当你在正则表达式中直接使用字符串时,它是插值的,所以你需要一个斜杠作为转义,而另一个作为你逃脱的。