与1相比,有什么不同,或者在任何情况下都可以互换。
示例:
s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;
他们都给出了相同的结果但是有什么不同吗?
答案 0 :(得分:16)
直接来自perldoc perlre:
警告\ 1 vs $ 1
有些人过于习惯写作 比如:
$pattern =~ s/(\W)/\\\1/g;
这对于a的RHS来说是有益的 替代,以避免震惊sed 上瘾者,但这是一个肮脏的习惯 成。那是因为在PerlThink中, “s ///”的右侧是一个 双引号。中的“\ 1” 通常的双引号字符串表示a 控制-A。惯用的Unix意思 为“s ///”插入“\ 1”。 但是,如果你养成了习惯 这样做,你自己进入 麻烦,如果你再添加一个“/ e” 改性剂。
s/(\d+)/ \1 + 1 /eg; # causes warning under -w
或者如果您尝试
s/(\d+)/\1000/;
你说不能消除歧义 “{1} 000”,而你可以修复它 “$ {1} 000”。的运作 插值不应该混淆 与匹配的操作 反向引用。
当然,他们的意思是两种不同 “s ///”。
左侧的东西
答案 1 :(得分:10)
我只在极少数情况下使用\1
,我需要匹配包含重复模式的早期部分。 e.g。
/(foo|bar)baz\1/
这将匹配“foobazfoo”或“barbazbar”而不是“foobazbar”。你不能在那里使用$1
。
在所有其他情况下,我使用$1
和亲属,因为使用其他符号的问题太多了。有关所有血腥的详细信息,请参阅perlre。
答案 2 :(得分: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";