Spec-Zone.ru › Perl 5.32

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' включён, регулярное выражение может содержать (?{ ... }) утверждения нулевой длины и (??{ ... }) отложенные подвыражения, полученные из интерполяции переменных, а не появляться буквально в регулярном выражении. Это обычно запрещено, так как это потенциальный риск для безопасности. Обратите внимание, что эта прагма игнорируется, когда регулярное выражение получено из заражённых данных, т.е. оценка всегда запрещена для заражённых регулярных выражений. См. "(?{ code })" в perlre и "(??{ code })" в 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 сегодня, могут не компилироваться или могут иметь больше или меньше предупреждений в будущем 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} в список свойств, разделённый запятыми, для использования при выделении строк включено/выключено, часть до точки включено/выключено. См. "Debugging Regular Expressions" в perldebug для дополнительной информации.

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

См. "Pragmatic Modules" в perlmodlib.

режим 'Debug'

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

Параметры, относящиеся к компиляции
COMPILE

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

PARSE

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

OPTIMISE

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

TRIEC

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

DUMP

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

FLAGS

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

TEST

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

Параметры, относящиеся к выполнению
EXECUTE

Включает все параметры отладки, относящиеся к выполнению, кроме дополнительных.

MATCH

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

TRIEE

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

INTUIT

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

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

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

BUFFERS

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

TRIEM

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

STATE

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

STACK

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

GPOS

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

OPTIMISEM

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

OFFSETS

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

NODENUM:POSITION[LENGTH]

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

OFFSETSDBG

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

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

DUMP_PRE_OPTIMIZE

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

WILDCARD

Когда Perl сталкивается с подшаблоном-подстановкой (см. "Подстановки в значениях свойств" в perlunicode), он приостанавливает компиляцию основного шаблона, компилирует подшаблон и затем сопоставляет его со всеми возможными вариантами, чтобы определить фактические кодовые точки, с которыми подшаблон совпадает. После этого он добавляет их к основному шаблону и продолжает компиляцию.

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

Вы можете использовать параметр WILDCARD, чтобы включить вывод отладки этого сопоставления подшаблонов. Осторожно! Это может привести к обширному выводу, и вам, возможно, не будет понятно, что и почему Perl делает то, что делает. Но это может быть полезно, чтобы понять, почему что-то идет не так, как ожидалось.

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

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

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

ALL

Включает все параметры одновременно, за исключением OFFSETS, OFFSETSDBG, BUFFERS, WILDCARD и DUMP_PRE_OPTIMIZE. (Чтобы получить каждый параметр без исключения, используйте 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' содержит ряд утилитных функций, которые могут быть необязательно экспортированы в пространство имен вызывающей программы. Они перечислены ниже.

is_regexp($ref)

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

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

regexp_pattern($ref)

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

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

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

В скалярном контексте она возвращает то же самое, что и Perl, когда строит строковое представление 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.32.0/re

Spec-Zone.ru

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