[Moscow.pm] Perl 5.10 known bug with (?| ... ) and named captures

Andrew Shitov andy на shitov.ru
Сб Ноя 24 02:16:11 PST 2007


Для тех, кто не был на первой встречи, сообщу, что мы совместно :-)
нашли баг в одной из новых возможностей регулярных выражений Perl
5.10.

Суть: если использовать две одинаково именованные переменные внутри
двух веток "|", заключенных в блок (?| ... ), то вторая именованная
переменная будет хранить "не те скобки", а именно скобки, номер
которых во втором подвыражении совпадает с номером скобок в первом
подвыражении, в которых именованная переменная встречается в первый
раз.

Пример:

my $re = qr/
        (?|
            (?<year>\d{4})  (\d\d)  (\d\d)
        |
            (\w+),  \s*  (?<year>\d{4})
        )
    /x;

'20071122' =~ $re;
say $+{year};       # Печатает '2007', верно.

'November, 2007' =~ $re;
say $+{year};       # Печатает 'November', ошибка.



Ответ разработчиков:

От:                  Rafael Garcia-Suarez via RT <perlbug-followup на perl.org>
К:                   andy на shitov.ru
Время создания:      Sat, 24 Nov 2007 02:02:16 -0800
Тема:                [perl #47762] 5.10: different behaviour of duplicated
                     named capturing parens with/without (?|...)

This doesn't look very difficult to fix, but for 5.10.0, since we're
in RC mode, it's probably better to document this as a known limitation.

(Это, похоже, несложно исправить, но в 5.10.0, поскольку эта
версия - релиз кандидат, вероятно лучше задокументировать это как
известное ограничение.)


--
Андрей Шитов
______________________________________________________________________
andy на shitov.ru | http://www.shitov.ru



Подробная информация о списке рассылки Moscow-pm