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
Дамп окончательного варианта программы после его компиляции и оптимизации.
- COMPILE
- Работа связанных опций
- Дополнительные отладочные опции
- EXTRA
Включает все "дополнительные" отладочные опции.
- BUFFERS
Включение отладки захвата буфера записи во время сопоставления шаблону. Внимание, это потенциально может производить очень большой вывод данных.
- TRIEM
Включает усовершенствованную TRIE отладку. Дополняет как TRIEE так и TRIEC.
- STATE
Включает отладку состояния в движке.
- STACK
Включает отладку рекурсии стека в движке. Включение или отключение этой опции автоматически делает тоже самое для отладки состояния. Результирующий вывод может быть очень большим.
- OPTIMISEM
Включить расширенную оптимизацию отладки и оптимизации стартовой точки. Используется разработчиками для отладки машины регулярных выражений.
- OFFSETS
Информация дампа смещения. Он может использоваться, чтобы видеть как regops коррелирует с шаблоном. Выходной формат
NODENUM:POSITION[LENGTH]
где 1 - это позиция первого символа в строке. Позиция может быть 0 или превышать длину шаблона, в то время как длина шаблона может быть равна нулю.
- OFFSETSDBG
Включает отладку смещения. Это выдает обширное количество информации трассировки и не цепляет также с другими отладочными опциями.
Опция определенно полезна для тех, кто занимается профессиональным хакингом над частью смещений отладочной машины.
- EXTRA
- Другие полезные флаги
Опции, о которых говорилось выше могут быть указаны одновременно, в этом случае можно воспользоваться следующими опциями:
- ALL
Включает все опции, за исключением
OFFSETS
,OFFSETSDBG
иBUFFERS
- All
Включает
DUMP
и все выполняемые опции. Эквивалент:use re 'debug';
- MORE
- More
Включает
TRIEM
и все опции, выполняемые во время компиляции и исполнения.
- ALL
Экспортируемые функции
Начиная с версии 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.