2009-07-01 164 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

相关问题