3

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

$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
4

3 回答 3

9

因为您在正则表达式中使用它——您可能想要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";
于 2010-06-03T19:53:59.027 回答
2

如果你设置$re = 'a\cc';,它会工作。当您将反斜杠作为变量包含在正则表达式中时,它并没有像您期望的那样被插值:它在替换中按字面意思使用。

或者,您可以用双引号定义字符串,但这不是一个好习惯。最好在字符串中始终使用单引号,除非您明确想要在内容中插入某些内容——它节省了极少的处理量,但它向读者暗示了程序员的意图。

于 2010-06-03T19:50:45.070 回答
0

问题是您使用单引号来定义$re. 这意味着当您在搜索模式中使用它时,它会查找两个斜杠。

单引号告诉 Perl 不要插入字符串,而是使用原始字符。每个斜线都按字面意思理解,并作为一种逃避。

比较:

$re0 = 'a\\cc';
$re1 = "a\\cc";

当你打印出来时,你会看到:

print $re0."\n".$re1."\n";

a\\cc
a\cc

另一方面,当您直接在正则表达式中使用字符串时,它会被插值,因此您需要一个斜杠作为转义符,另一个作为您要转义的内容。

于 2010-06-03T19:51:27.000 回答