Прагма '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.

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

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

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

Название

feature - прагма для включения поддержки новых синтаксических возможностей

Синопсис

    use feature qw(switch say); # поддержка новых встроенных функций 
                                # switch и say
    given ($foo) {
        when (1)	  { say "\$foo == 1" }
        when ([2,3])	  { say "\$foo == 2 || \$foo == 3" }
        when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
        when ($_ > 100)   { say "\$foo > 100" }
        default		  { say "Ни одно условие не сработало" }
    }

    use feature ':5.10'; # включить все новые синтаксические
                         # возможности perl 5.10

Описание

Обычно невозможно добавить новый синтаксис в Perl без нарушения правильной работы некоторых существующих программ. Данная прагма обеспечивает возможность свести этот риск к минимуму. Новые синтаксические конструкции могут быть включены конструкцией use feature 'некая_функция', и могут использоваться в её лексической области видимости.

Эффект лексической области видимости

Подобно другим прагмам (use strict к примеру), feature действует в лексической области видимости. use feature qw(функция) подключит функцию "функция" до конца текущей области видимости.

    {
        use feature 'say';
        say "say доступна здесь...";
    }
    print ".. но не здесь.\n";

no feature

    use feature 'say';
    say "Здесь можно использовать новую функцию say";
    {
        no feature 'say';
        print "Но не здесь.\n";
    }
    say "и здесь say доступна";

no feature без перечисления функций отключает их все.

Функция 'switch'

use feature 'switch' сообщает компилятору, что нужно подключить конструкцию given/when.

См. Переключатель switch

Функция 'say'

use feature 'say' сообщает компилятору, подключить функцию 'say'.

См. "say" in perlfunc.

Функция 'state'

use feature 'state' сообщает компилятору подключить поддержку функции 'state'.

Стойкие приватные переменные

Наборы функций

Можно загрузить все функции разом, используя набор функций (анг. feature bundle). В настоящее время доступен только один вариант набора функций - конструкция use feature ":5.10", которая эквивалентна use feature qw(switch say state).

Указание подверсий, например 0 в 5.10.0 не имеет никакого эффекта.

Неявная загрузка feature

Есть два пути загрузить прагму feature неявно:

  • С помощью флага -E в командной строке, вместо -e. Она неявно подключит поддержку всех новых функций.

  • По явному требованию минимальной версии Perl для вашей программы конструкцией use VERSION, когда указанная версия выше или равна 5.10.0. То есть,

        use 5.10.0;
    

    неявно подключит:

        use feature ':5.10';
    

    Но во избежание предупреждений, связанных с портативностью (анг. portability warnings) (см. "use" in perlfunc), вы пожете писать так:

        use 5.010;
    

    с тем же самым эффектом.

Categories

Statistic