May 2010 Archives

Прагма 're'
категория: re

re - Прагма для управления поведением ругулярных выражений Perl

Краткое описание

use re 'taint';
($x) = ($^X =~ /^(.*)$/s);      # $x помечена 

$pat = '(?{ $foo = 1 })';
use re 'eval';
/foo${pat}bar/;                 # не вызывает ошибку (если не указан флаг -T)

{
    no re 'taint';              # отключен режим меченных данных
    ($x) = ($^X =~ /^(.*)$/s);  # $x не помечена 

    no re 'eval';               # поведение по умолчанию 
    /foo${pat}bar/;             # запрещено ( независимо от того, включен -T или нет)
}

use re 'debug';                 # как 'perl -Dr' выводить отладочную информацию 
/^(.*)$/s;                      # на этапах компиляции и исполнения


use re 'debugcolor';            # то же, что 'debug', но с окрашенной выдачей
...

use re qw(Debug All);           # Детально настроенные отладочные опции
use re qw(Debug More);
no re qw(Debug ALL);            # Включить все отладочные опции прагмы re в текущей области видимости

use re qw(is_regexp regexp_pattern); # импортировать функции 
my($pat,$mods) = regexp_pattern(qr/foo/i);
if (is_regexp($obj)) { 
    print "Got regexp: ",
        scalar regexp_pattern($obj); # шаблон скомпилированного
}                                    # регулярного выражения преобразуется в строку

(В наших примерах используется $^X, потому что они меченные по умолчанию)

Подробное описание, примеры

Режим 'меченных данных'

Когда действует use re 'taint' и объект регулярного выражения представляет собой меченную строку, нумерованные переменные регулярного выражения и значения, возвращаемые оператором m// в списковом контексте, являются помеченными. Это полезно, когда регулярные выражения над помеченными данными предназначены не для извлечения безопасных подстрок, а для осуществления прочих преобразований.

Режим 'eval'

Когда действует use re 'eval', то в регулярном выражении разрешены утверждения, выполняющие код Perl, такие как утвреждение нулевой ширины(кодовое утверждение) (?{ ... }) и отложенные подвыражения (??{ ... }), даже, если регулярное выражение содержит интерполируемые переменные.

Для целей этой прагмы, интерполяция предварительно компилированного регулярного выражения ( создаваемого оператором qr//) не считается переменной интерполяции. Таким образом.

/foo${pat}bar/

допускается если $pat является скомпилированным регулярным выражением, даже если $pat содержит утверждения (?{ ... }) или подвыражения (??{ ... })

Режим 'debug'

При действии use re 'debug', perl выводит отладочные сообщения во время компиляции и выполнения регулярных выражений. Вывод получается такой же, как при выполнении "отладочного Perl"(скомпилированного с ключом -DDEBUGGING компилятора C) с ключом -Dr командной строки. В зависимости от сложности шаблона результирующий вывод может быть огромным. Если вместо debug указать debugcolor, осуществляется расцвечивание вывода в терминалах (если в них имеется поддержка последовательностей, управляющие цветом). Установите в переменную окружения $ENV{PERL_RE_TC} список с разделителем-запятой соответствующих свойств termcap(5) который будет использоваться для настройки подсвечивания.

Начиная с 5.9.5 директива use re 'debug' и его эквиваленты действуют в лексической области видимости, как и другие директивы прагмы. Тем не менее, они имеют эффект как во время компиляции, так и во время выполнения.

О действиях прагм можно почитать в разделе Модули прагм (perlmodlib)(пока что только на английском).

Режим 'Debug'

Аналогично режиму 'debug' отладочный вывод производится при использовании use re 'Debug', разница в том, что данный метод предоставляет тонкую настройку вывода отладочной информации. Опции разделены на три группы, одна связана с компиляцией, другая с выполнением а третья для специальных целей. Имеются следующие опции:

  • Опция компиляции
    • COMPILE

      Включает все отладочные опции связанные с компиляцией.

    • PARSE

      Включает вывод отладочной информации, связанной с процессом разбора шаблона.

    • OPTIMISE

      Позволяет связать вывод со стадией оптимизации во время компиляции.

    • TRIEC

      Подробная информация о дереве фазы компиляции.

    • DUMP

      Дамп окончательного варианта программы после его компиляции и оптимизации.

  • Работа связанных опций
    • EXECUTE

      Включает все отладочные опции, связанные с выполнением.

    • MATCH

      Включает отладку главных циклов сопоставления с шаблоном.

    • TRIEE

      Дополнительная отладочная информация по выполнению дерева кода.

    • INTUIT

      Включает отладку стартовой точки оптимизации.

  • Дополнительные отладочные опции
    • EXTRA

      Включает все "дополнительные" отладочные опции.

    • BUFFERS

      Включение отладки захвата буфера записи во время сопоставления шаблону. Внимание, это потенциально может производить очень большой вывод данных.

    • TRIEM

      Включает усовершенствованную TRIE отладку. Дополняет как TRIEE так и TRIEC.

    • STATE

      Включает отладку состояния в движке.

    • STACK

      Включает отладку рекурсии стека в движке. Включение или отключение этой опции автоматически делает тоже самое для отладки состояния. Результирующий вывод может быть очень большим.

    • OPTIMISEM

      Включить расширенную оптимизацию отладки и оптимизации стартовой точки. Используется разработчиками для отладки машины регулярных выражений.

    • OFFSETS

      Информация дампа смещения. Он может использоваться, чтобы видеть как regops коррелирует с шаблоном. Выходной формат

         NODENUM:POSITION[LENGTH]
      

      где 1 - это позиция первого символа в строке. Позиция может быть 0 или превышать длину шаблона, в то время как длина шаблона может быть равна нулю.

    • OFFSETSDBG

      Включает отладку смещения. Это выдает обширное количество информации трассировки и не цепляет также с другими отладочными опциями.

      Опция определенно полезна для тех, кто занимается профессиональным хакингом над частью смещений отладочной машины.

  • Другие полезные флаги

    Опции, о которых говорилось выше могут быть указаны одновременно, в этом случае можно воспользоваться следующими опциями:

    • ALL

      Включает все опции, за исключением OFFSETS, OFFSETSDBG и BUFFERS

    • All

      Включает DUMP и все выполняемые опции. Эквивалент:

        use re 'debug';
      
    • MORE
    • More

      Включает TRIEM и все опции, выполняемые во время компиляции и исполнения.

Экспортируемые функции

Начиная с версии Perl 5.9.5 прагма re предоставляет ряд полезных функций, которые могут быть опционально экспортируемы в пространство имен вызывающей функции. Они перечислены ниже:

  • is_regexp($ref)

    Возвращает значение "истина", если является скомпилированным регулярным выражением, созданный оператором qr//, в противном случае возвращает "ложь".

    Функция не может быть обманута перезагрузкой или "благословением". Во внутренних термах, она извлекает указатель регекспа из структуры PERL_MAGICK_qr.

  • regexp_pattern($ref)

    Если передано скомпилированное регулярное выражение, созданное qr//, функция возвращает его шаблон.

    В контексте списка возвращает два элемента, первый элемент содержит шаблон, второй - модификаторы, которые были использованы при компиляции данного шаблона.

      my ($pat, $mods) = regexp_pattern($ref);
    
  • regmust($ref)

    Если аргументом является скомпилированное регулярное выражение (созданное оператором qr//), функция возвращает самую длинную закрепленную фиксированную строку и самую длинную плавающую фиксированную строку.

    Фиксированная строка (анг. fixed string) определяется как подстрока, которая должна выступать для шаблона сопоставления. Закрепленная фиксированная строка (анг. anchored fixed string) - это зафиксированная строка, которая должна находиться в определенном смещении от начала шаблона. Плавающая фиксированная строка (анг. floating fixed string) - определяется как фиксированная строка, которая может появляться в любом месте из диапазона различных позиций по отношению к началу шаблона сопоставления. Например:

    my $qr = qr/here .* there/x;
    my ($anchored, $floating) = regmust($qr);
    print "anchored:'$anchored'\nfloating:'$floating'\n";
    

    выводит:

    anchored:'here'
    floating:'there'

    Так как в шаблоне here находится до .*, его позиция может быть определена точно. Однако нельзя сказать тоже самое для there: он может появиться в любом месте строки после позиции, до которой сопоставлена первая часть шаблона.

    Примечание: Закрепленные и плавающие строки не обязательно безусловно являются самыми длинными. Это то, что оптимизатор Perl, который вы используете, считает таковыми. Если вы считаете, что он выдает неправильный результат, пожалуйста, сообщите об этом через утилиту perlbug.

  • regname($name,$all)

    Возвращает содержимое именованного буфера последнего успешного сопоставления. Если $all истинно, тогда возвращается массив ссылок, содержащих по одной записи на буфер, в противном случае возвращает первый определенный буфер.

  • regnames($all)

    Возвращает список всех именованных буферов, определенных в последнем успешном сопоставлениии. Если $all истинно, то возвращаются все определенные имена, если нет, то возвращаются только те имена, которые были вовлечены в шаблон поиска.

  • regnames_count()

    Возвращает число различных имен, определенных в шаблоне, используемом для последнего успешного сопоставления.

    Примечание: этот результат всегда является реальным числом определенных именованных буферов, он не может быть сопоставлен с тем, что возвращается функцией regnames() и связанными с ним процедурами, если данные процедуры не были вызваны с установленным параметром $all.

Дополнительная информация

Модули прагм.

Categories

Statistic

About this Archive

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

March 2010 is the previous archive.

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