Означают ли следующие обозначения группы захвата что-то для Perl?

В следующем, почему условие оценивается как false?

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

Есть ли \11 или же \111 имеют особое значение, что Perl Не могу видеть" \1?

2 ответа

На самом деле Perl интерпретирует \111 как восьмеричное, которое не найдено в вашей строке. Он будет рассматривать только две или более цифр обратных ссылок, если будет найдено такое количество групп. Чтобы избежать двусмысленности, используйте \g или же \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) { ...
Другие вопросы по тегам