February 2010 Archives

Новая прагма mro

Добавлена новая прагма, mro ( для порядка разрешения метода(Method Resolution Order )). Это позволяет переключаться на базовый класс (per-class basis), алгоритм, который perl использует для поиска унаследованных методов в иерархии множественного наследования. По умолчанию MRO не изменен ( Поиск в глубину (DFS, Depth First Search ). Другой MRO имеется в наличии: C3 алгоритм. Смотрите mro для получения более подробной информации (Brandon Black)

Отметим, что в связи с изменениями в осуществлении поиска иерархии класса, код, который используется для присвоения *ISA неопределенного значения скорее всего будет прерван. Во всяком случае, присвоение неопределенного значения *ISA имел побочный эффект удаления магического массива @ISA а это не должно было происходить. Также, кэш *::ISA::CACHE:: больше не существует, чтобы заставить сбросить кэш @ISA, теперь нужно использовать mro API, или же просто осуществить присвоение массиву @ISA (например @ISA = @ISA ).

  • Рекурсивные шаблоны

    Добавлена конструкция (?PARNO) для составления рекурсивных структур регексов.

    Каждый захват скобок может теперь рассматриваться как независимый шаблон, который может быть введен с использованием синтаксиса (?PARNO) (где PARNO - номер захватывающего буфера). Например, следующий шаблон будет сопоставлен вложенным сбалансированным угловым скобкам.

       "text.. <a  <b> > .. text.. " =~ /(
              <(?:
                (?>[^<>]+)
                |
                (?1)   # возврат к началу первой 
                          # захватывающей скобке 
            )*>
        )/x
      and print $1; # выводит <a  <b> >;
     

    Я пока данную возможность на практике не использовал, если у вас имеются более показательные примеры реализации рекурсивных структур с использованием (?PARNO) поделитесь с народом в комментарии к этому посту, если не жалко.

  • Именованные захватывающие скобки

    Теперь в шаблоне можно именовать захватывающие скобки и обращаться к их содержимому по имени. Синтаксис именования (?<NAME>....). Это позволяет ссылаться к именованным буферам используя синтаксис \k<NAME> . В шаблоне, новые магические хэши %+ и %- могут быть использованы для доступа к содержимому буферу захвата.

    Простой пример удаления дублирующих симвовов с использованием именованных захватывающих скобок:

       my $word = "aab";
      # удалить дублирующие символы
      $word =~ s/(?<letter>.)\k<letter>/$+{letter}/g; 
      print $word; # выводит "ab"
     

    В %+ и %- сохраняются именованные буферы захвата:

       'foo' =~ /(?<named_buffer>foo)/;
    
    
      # теперь  в %+ и %- содержится следующее
      %- =( 'named_buffer' => 'foo');
      %- =( 'named_buffer' => [ 'foo' ] );
     

    %+ и %- реализуются как связанные хэши с помощью стандартного модуля Tie::Hash::NamedCapture.

       --- неясности с переводом --- 
      здесь содержится то, что я не смог перевести, надеюсь на 
      отзывчивость perlhack`еров
      -----------------------------
    
    
      --- EN --- 
      Users exposed to the .NET regex engine will find that
      the perl implementation differs in that the numerical
      ordering of the buffers is sequential, and not "unnamed
      first, then named". Thus in the pattern
      --- RU --- 
      Пользователи, использующие регулярную машину .NET
      найдут, что perl реализация буферов в что числовое
      упорядочивание буферов является последовательным, и не
      "названный первым, который тогда назван".  Таким образом
      шаблон
    
         /(A)(?<B>B)(C)(?<D>D)/
    
      --- EN --- 
      $1 will be 'A', $2 will be 'B', $3 will be 'C' and $4
      will be 'D' and not $1 is 'A', $2 is 'C' and $3 is 'B'
      and $4 is 'D' that a .NET programmer would expect. This
      is considered a feature. :-)
      (Yves Orton)
      --- RU --- 
      $1 будет содержать 'A', $2 будет содержать 'B', $3 будет
      содержать 'C' и $4 будет 'D', что .NET программист будет
      ожидать. Это продуманная функция :) 
      (Yves Orton)
    
      ---/ неясности с переводом --- 
  • Сверхжадные квантификаторы

    Perl теперь поддерживает "сверхжадные квантификаторы"(possessive quantifier) которые захватывают максимальное соответствие и никогда не возвращаются назад. Таким образом они могут быть использованы для контроля отката назад(control backtraking). Сверхжадный квантификатор синтаксически может использоваться там же где и нежадный модификатор(non-greedy) ?, только вместо него ставится модификатор + . В результате получаются примерно такие конструкции ?+, *+ , ++ , {min,max}+ .

    P.S: По сверхдажным квантификаторам есть хорошая статья на хабре

  • Глаголы Backtracking контроля

    Машина регулярных выражений поддерживает ряд глаголов специального назначения для контроля отката назад(backtrack control): (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL) и (*ACCEPT). За подробностями обращайтесь к странице perlre. (Yves Orton)

  • Относительные обратные ссылки (Relative backreferences)

    Новые синтаксические конструкции \g{N} или \gN где "N" десятичное число позволяет безопасную форму обозначений ссылок на найденный текст а также позволяет относительные ссылки на найденный текст. Это должно сделать легче генерацию и вставку шаблонов, которые содержат ссылки на найденный текст. Смотрите Буферы захвата . (Yves Orton)

  • Метазнак \K

    Функциональность модуля Regexp::Keep Джеффа Пинуана(Jeff Pinyan) была встроена в ядро. В регулярных выражениях вы можете теперь использовать специальный метасимвол \K как способ исользовать что-нибудь наподобие конструкции плавающего позитивного заглядывания назад

       s/(foo)bar/$1/g
     

    что может быть преобразовано в

       s/foo\Kbar//g
     

    который является гораздо более эффективным. (Yves Orton)

  • Вертикальный, горизонтальный пробел и разрыв строки

    Регулярные выражения теперь распознают escape последовательности \v и \h которые соответствуют символам вертикального и горизонтального пробела. \V и \H логично противоположны первым двум метасимволам.

    \R соответствует общему символу разрыва строки, то есть символу вертикального пробела плюс последовательность символов "\x0D\x0A" .

Statistic

About this Archive

This page is an archive of entries from February 2010 listed from newest to oldest.

March 2010 is the next archive.

Find recent content on the main index or look in the archives to find all content.