2010-06-03 171 views
3

如何替换变量内的反斜杠?用Perl中变量中的反斜杠替换文字

$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 

回答

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"; 
2

如果设置$re = 'a\cc';,它会工作。反斜杠并没有如你所期望的那样插入正则表达式,因为它将它作为变量包含在正则表达式中:它在字面上用于替换。

或者,你可以用双引号定义字符串,但这不是一个好习惯。除非明确地要插入内容中的某些内容,否则总是在您的字符串中使用单引号更好 - 它可以节省极少量的处理,但是这对读者来说是程序员意图的暗示。

0

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

单引号告诉Perl不要插入字符串,而是使用原始字符。每个斜线都是字面意义上的,并且是一种逃避。

比较:

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

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

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

a\\cc 
a\cc 

在另一方面,当你直接在正则表达式使用的字符串,它的内插,所以你需要一个斜线作为逃跑,另一个斜线是你逃跑的目标。

+0

使用单引号是好的。在这种情况下,不需要插入字符串。 – Ether 2010-06-03 19:53:15