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
?
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
?
实际上,Perl 将其解释 \111
为八进制,在您的字符串中找不到。如果找到这样数量的组,它只会考虑两位或更多数字的反向引用。为避免歧义,请使用\g
or \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 位数字,因为前导零表示八进制常量。
它将\111
视为单个项目,因为没有任何东西可以将 .\1
与. 分开11
。如果您使用/x
修饰符来允许间距,则可以消除歧义:
if(/(.)\1 11/x) { ...