|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sergey 2:5020/400 23 Dec 2006 14:37:10 To : All Subject : Re: Hет логики в re --------------------------------------------------------------------------------
Привет.
JL> Это поведение вполне логично. Оно описано в perldoc perlop, раздел
JL> "Repeated patterns matching zero-length substring":
Ох, а я и не знал, что у переменных есть еще и состояние "предыд. поиск имел
0-ю длину совпадения". Кругом сплошные тонкости.
А как объяснить такое чудо?
$_=''; print 'OK' if /()\1/;
Выдает OK.
$_=''; print 'OK' if /()?\1/;
Hе найдено! В чем отличие от случая 1? Ведь вначале ? соответствует 1 повтору
и возврата в переборе быть не должно, а выходит, что он вроде бы есть.. Если
убрать \1, то совпадение есть.
Это выглядит еще более странным на фоне того, что
$_=''; print 'OK' if /()?()/;
тоже совпадает.
$_=''; print 'OK' if /((?{print 'ABC '}))?\1/;
Опа, опять найдено! И еще выдает ABC.
Я, конечно, понимаю, что вставленный код всегда совпадает, но ведь и так и
сяк там пустота должна совпасть...
И еще такое замечание: если переменная $1 не существует (перебор обошел ветку
с первой парой скобок стороной), то \1 внутри шаблона ничему не соответствует,
в том числе пустому фрагменту, а $1, вставленная как (??{$1}), соответствует
пустому фрагменту, хотя Перл ругается, что $1 не определена. Здесь тоже
непонятная логика.
Проверял в ActivePerl 5.8.0.805 под Win32.
Сергей
--- ifmail v.2.15dev5.3
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1667923e0ad2e.html, оценка из 5, голосов 10
|