2010-06-03 174 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