Spec-Zone.ru › Perl 5.30

re

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Режим 'taint'
    • Режим 'eval'
    • Режим 'strict'
    • Режим '/flags'
    • Режим 'debug'
    • Режим 'Debug'
    • Экспортируемые функции
  • СМОТРИТЕ ТАКЖЕ

ИМЯ

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

СИНТАКСИС

use re 'taint';
($x) = ($^X =~ /^(.*)$/s);     # $x is tainted here

$pat = '(?{ $foo = 1 })';
use re 'eval';
/foo${pat}bar/;                # won't fail (when not under -T
                               # switch)

{
    no re 'taint';             # the default
    ($x) = ($^X =~ /^(.*)$/s); # $x is not tainted here

    no re 'eval';              # the default
    /foo${pat}bar/;            # disallowed (with or without -T
                               # switch)
}

use re 'strict';               # Raise warnings for more conditions

use re '/ix';
"FOO" =~ / foo /; # /ix implied
no re '/x';
"FOO" =~ /foo/; # just /i implied

use re 'debug';                # output debugging info during
/^(.*)$/s;                     # compile and run time


use re 'debugcolor';           # same as 'debug', but with colored
                               # output
...

use re qw(Debug All);          # Same as "use re 'debug'", but you
                               # can use "Debug" with things other
                               # than 'All'
use re qw(Debug More);         # 'All' plus output more details
no re qw(Debug ALL);           # Turn on (almost) all re debugging
                               # in this scope

use re qw(is_regexp regexp_pattern); # import utility functions
my ($pat,$mods)=regexp_pattern(qr/foo/i);
if (is_regexp($obj)) {
    print "Got regexp: ",
        scalar regexp_pattern($obj); # just as perl would stringify
}                                    # it but no hassle with blessed
                                     # re's.

(В этих примерах используется $^X, так как он по умолчанию заражён.)

ОПИСАНИЕ

Режим 'taint'

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

Режим 'eval'

Когда use re 'eval' включён, регулярное выражение разрешено содержать (?{ ... }) утверждения нулевой ширины и (??{ ... }) отложенные подвыражения, полученные из интерполяции переменных, а не отображаться буквально в регулярном выражении. Обычно это запрещено, так как это потенциальная угроза безопасности. Обратите внимание, что этот псевдоним игнорируется, когда регулярное выражение получено из заражённых данных, т. е. оценка всегда запрещена с заражёнными регулярными выражениями. См. "(?{ код })" в perlre и "(??{ код })" в perlre.

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

/foo${pat}bar/

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

Режим 'strict'

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

Когда use re 'strict' включён, применяются более строгие проверки, чем обычно, при компиляции шаблонов регулярных выражений. Это может привести к появлению большего количества предупреждений, чем обычно, и большему количеству фатальных ошибок вместо просто предупреждений. Цель этого — найти и сообщить на этапе компиляции некоторые вещи, которые могут быть законными, но с высокой вероятностью не соответствуют реальным намерениям программиста. Этот режим автоматически включает категорию предупреждений "regexp" (если она ещё не включена) в своём объёме.

Пример того, что обнаруживается в режиме "strict', но не обнаруживается иначе, — это шаблон

qr/\xABC/

Конструкцию "\x" без фигурных скобок должно следовать ровно две шестнадцатеричные цифры; в этом случае их три. Сейчас это эквивалентно

qr/\x{AB}C/

то есть символу, код которого 0xAB, за которым следует буква C. Но так как C — шестнадцатеричная цифра, есть высокая вероятность, что намерением было

qr/\x{ABC}/

то есть одиночному символу по коду 0xABC. В режиме 'strict' ошибка, если после \x не следуют ровно две шестнадцатеричные цифры. Если режим 'strict' не активен, при наличии только одной шестнадцатеричной цифры генерируется предупреждение, а при наличии более двух — нет.

Ожидается, что поведение 'strict' будет эволюционировать по мере накопления опыта. Это означает, что программы, которые компилируются с этим режимом в нынешнем Perl, могут не компилироваться или иметь больше или меньше предупреждений в будущих версиях. Нет никаких гарантий обратной совместимости с этим режимом. Кроме того, уже есть предложения по альтернативному синтаксису для его активации. По этим причинам использование этого режима вызовет предупреждение класса experimental::re_strict, если эта категория не отключена.

Обратите внимание, что если шаблон, скомпилированный в режиме 'strict', повторно компилируется, например, путём интерполяции в другой шаблон, вне режима 'strict', он не проверяется на строгость повторно. Это связано с тем, что если он работает в режиме строгости, он должен работать и без него.

Режим '/flags'

Если указаны use re '/flags', то данные флаги автоматически добавляются ко всем регулярным выражениям до конца лексического диапазона. Флаги могут быть любым сочетанием 'a', 'aa', 'd', 'i', 'l', 'm', 'n', 'p', 's', 'u', 'x', и/или 'xx'.

no re '/flags' отключит действие use re '/flags' для заданных флагов.

Например, если вы хотите, чтобы все ваши регулярные выражения по умолчанию имели /msxx, просто добавьте

use re '/msxx';

в начало вашего кода.

Флаги набора символов /adul взаимно исключают друг друга. Таким образом, в данном примере

use re "/u";
"ss" =~ /\xdf/;
use re "/d";
"ss" =~ /\xdf/;

второй use re выполняет неявное no re '/u'.

Аналогично

use re "/xx";   # Doubled-x
...
use re "/x";    # Single x from here on
...

Включение одного из флагов набора символов с use re имеет приоритет над псевдонимом locale и псевдонимом 'unicode_strings' feature, для регулярных выражений. Отключение одного из этих флагов, когда он активен, возвращает поведение, заданное другими псевдонимами в области видимости. Например:

use feature "unicode_strings";
no re "/u"; # does nothing
use re "/l";
no re "/l"; # reverts to unicode_strings behaviour

Режим 'debug'

Когда use re 'debug' включён, Perl выводит отладочные сообщения при компиляции и использовании регулярных выражений. Вывод такой же, как при запуске интерпретатора Perl с флагом -Dr. Он может быть довольно объёмным в зависимости от сложности сопоставления. Использование debugcolor вместо debug позволяет получить вывод, который можно использовать для цветного отображения на терминалах, понимающих цветные последовательности termcap. Установите $ENV{PERL_RE_TC} в виде списка через запятую свойств termcap для включения/выключения выделения строк, выделения части до точки.

Подробности см. в "Отладка регулярных выражений" в perldebug.

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

См. "Псевдонимные модули" в perlmodlib.

Режим 'Debug'

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

Опции, связанные с компиляцией
COMPILE

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

PARSE

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

OPTIMISE

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

TRIEC

Подробная информация о компиляции trie.

DUMP

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

FLAGS

Выводит флаги, связанные с программой.

TEST

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

Опции, связанные с выполнением
EXECUTE

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

MATCH

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

TRIEE

Дополнительная отладка выполнения trie.

INTUIT

Включает отладку оптимизаций начальной точки.

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

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

BUFFERS

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

TRIEM

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

STATE

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

STACK

Включает отладку стека рекурсии в движке. Включение или отключение этой опции автоматически выполняет то же самое для отладки состояний. Этот вывод может быть довольно объёмным.

GPOS

Включает отладку модификатора \G.

OPTIMISEM

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

OFFSETS

Выводит информацию об смещениях. Это может быть использовано для просмотра того, как regops соотносятся с шаблоном. Формат вывода

NODENUM:POSITION[LENGTH]

Где 1 — позиция первого символа в строке. Обратите внимание, что позиция может быть 0 или больше фактической длины шаблона, точно так же как длина может быть нулевой.

OFFSETSDBG

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

Почти наверняка полезно только тем, кто работает над частью движка отладки, связанной со смещениями.

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

Это полезные сокращения для экономии времени набора.

ALL

Включает все опции, кроме OFFSETS, OFFSETSDBG и BUFFERS. (Чтобы получить все опции без исключения, используйте оба ALL и EXTRA или, начиная с версии 5.30 в интерпретаторе Perl с поддержкой -DDEBUGGING , используйте командные строки -Drv.)

All

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

use re 'debug';
MORE
More

Включает опции, включенные в "All", плюс STATE, TRIEC и TRIEM.

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

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

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

is_regexp($ref)

Возвращает true, если аргумент является скомпилированным регулярным выражением, возвращенным qr//, и false, если нет.

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

regexp_pattern($ref)

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

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

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

В скалярном контексте она возвращает то же самое, что и perl при строковом представлении raw qr// с тем же шаблоном внутри. Если аргумент не является скомпилированной ссылкой, то эта функция возвращает false, но определённую в скалярном контексте, и пустой список в контексте списка. Таким образом, следующее

if (regexp_pattern($ref) eq '(?^i:foo)')

будет свободно от предупреждений независимо от того, что на самом деле представляет собой $ref.

Как и is_regexp, эта функция не будет вводиться в заблуждение перегрузкой или благословлением объекта.

regmust($ref)

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

Фиксированная строка определяется как подстрока, которая должна появиться для соответствия шаблону. Закреплённая фиксированная строка — это фиксированная строка, которая должна появиться в определённом смещении от начала совпадения. Плавающая фиксированная строка определяется как фиксированная строка, которая может появиться в любой точке диапазона позиций относительно начала совпадения. Например,

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

результатом является

anchored:'here'
floating:'there'

Поскольку here стоит перед .* в шаблоне, её положение можно определить точно. Однако это не относится к there; она может появиться в любой точке после того, как появилась закреплённая строка. Perl использует обе для оптимизации, отдавая предпочтение более длинной или, если они равны, плавающей.

ПРИМЕЧАНИЕ: Это необязательно самая длинная закреплённая и плавающая строка. Это то, что оптимизатор Perl, который вы используете, считает самым длинным. Если вы считаете, что результат неверен, сообщите об этом через утилиту perlbug.

regname($name,$all)

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

regnames($all)

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

regnames_count()

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

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

СМОТРИ ТАКЖЕ

"Прагматические модули" в perlmodlib.

© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/re

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API