2009-07-01 228 views
9

與$ 1相比,\ 1有什麼區別,如果有的話,或者它們在所有情況下都可以互換。

例子:

s/([a-z]+),afklol/$1,bck/; 
#against 
s/([a-z]+),afklol/\1,bck/; 

他們都給予同樣的結果,但有什麼區別呢?

回答

16

直接從perldoc perlre

警告在\ 1比$ 1

有些人太習慣了編寫 的東西,如:

$pattern =~ s/(\W)/\\\1/g; 

這是祖父對於a的RHS 替代,以避免令人震驚的成癮者,但它是一個骯髒的習慣得到 成。這是因爲在PerlThink中,「s ///」的右邊是 雙引號字符串。 「\ 1」中的 通常的雙引號字符串表示控制-A爲 。 「\ 1」的習慣Unix含義 因爲「///」而被封存。 但是,如果您養成了這樣做的習慣,如果您添加了「/ e」 修飾符,您會陷入 的困境。

s/(\d+)/ \1 + 1 /eg;  # causes warning under -w 

或者,如果你嘗試做

s/(\d+)/\1000/; 

不能消除歧義,通過說 「{1} 000」,而你可以用 修復它 「$ {1} 000」 。不應將 插值的操作與 與匹配 反向引用的操作混淆。

當然,它們是指「s ///」左側有兩個不同的 東西。

1

他們給出了相同的結果,但1美元保留其價值,而1美元沒有。試試這個:

s/([a-z]+),afklol/$1,bck/; 
print "\$1 is $1\n"; 
#against 
s/([a-z]+),afklol/\1,bck/; 
print "\\1 is \1\n"; 
+1

這是因爲在m //或s /// \ 1之外不是反向引用。 (它實際上取決於上下文。) – 2009-07-01 17:39:08

9

我只在極少數情況下,我需要比賽進行到包括模式的早期部分的重複使用\1。例如

/(foo|bar)baz\1/ 

這會匹配「foobazfoo」或「barbazbar」而不是「foobazbar」。您不能那裏使用$1

在所有其他情況下,我使用$1和親屬,因爲使用其他符號的問題太多了。所有血淋淋的細節見perlre

+1

這就是我想知道什麼時候看到這個問題:它們都可以用於反向引用嗎? – Axeman 2009-07-01 14:57:53

相關問題