4

In the following why does the condition evaluate to false?

$_ = "aa11bb";  
if(/(.)\111/){  
    print "It matched!\n";  
}  

Does \11 or \111 have special meaning that Perl can not "see" \1?

4

2 回答 2

6

实际上,Perl 将其解释 \111为八进制,在您的字符串中找不到。如果找到这样数量的组,它只会考虑两位或更多数字的反向引用。为避免歧义,请使用\gor \g{}。引用文档(perlre - Capture Groups):

\g 和 \k 符号是在 Perl 5.10.0 中引入的。在此之前,没有命名或相对编号的捕获组。使用 \1 , \2 等来引用绝对编号的组,并且这种表示法仍然被接受(并且可能总是会被接受)。但是如果有超过 9 个捕获组,则会导致一些歧义,因为 \10 可能表示第十个捕获组,或者八进制序数为 010 的字符(ASCII 中的退格)。Perl 通过将 \10 解释为反向引用来解决这种歧义,前提是它之前至少打开了 10 个左括号。同样,\11 只有在它之前至少打开了 11 个左括号时才是反向引用。等等。\1 到 \9 总是被解释为反向引用。下面有几个例子说明了这些危险。如果您的意思是捕获组,您可以通过始终使用 \g{} 或 \g 来避免歧义;对于八进制常量,总是使用 \o{} ,或者对于 \077 及以下,使用前导零填充的 3 位数字,因为前导零表示八进制常量。

于 2013-08-05T20:20:50.220 回答
5

它将\111视为单个项目,因为没有任何东西可以将 .\1与. 分开11。如果您使用/x修饰符来允许间距,则可以消除歧义:

if(/(.)\1 11/x) { ...
于 2013-08-05T20:30:43.223 回答