Spec-Zone.ru › Perl 5.34

re

СОДЕРЖАНИЕ

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

ИМЯ

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

СИНТАКСИС

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 pragma и '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 с -DDEBUGGING -флагом -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

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

DUMP

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

FLAGS

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

TEST

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

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

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

MATCH

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

TRIEE

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

INTUIT

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

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

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

BUFFERS

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

TRIEM

Включить расширенную отладку дерева поиска. Расширяет как 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

Включает параметры, включенные в "Все", плюс 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, эта функция не будет запутана перегрузкой или благословением объекта.

regname($name,$all)

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

regnames($all)

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

regnames_count()

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

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

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.

optimization($ref)

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

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

В текущей версии хеш будет содержать следующее:

minlen

Целое число, наименьшее количество символов в любой строке, которая может соответствовать.

minlenret

Целое число, наименьшее количество символов, которое может быть в $& после совпадения. (Рассмотрите, например, /ns(?=\d)/ .)

gofs

Целое число, количество символов перед pos() для начала совпадения.

noscan

Логическое значение, TRUE указывая, что любые найденные якорные/плавающие подстроки не должны использоваться. (CHECKME: по-видимому, это устанавливается для якорного шаблона без плавающей подстроки, но никогда не используется.)

isall

Логическое значение, TRUE указывая, что информация об оптимизации — всё, что содержит регулярное выражение, и поэтому не нужно входить в движок выполнения регулярного выражения.

anchor SBOL

Логическое значение, TRUE если шаблон закреплён в начале строки.

anchor MBOL

Логическое значение, TRUE если шаблон закреплён в начале любой строки в строке.

anchor GPOS

Логическое значение, TRUE если шаблон закреплён в конце предыдущего совпадения.

skip

Логическое значение, TRUE если стартовый класс может совпадать только с первым элементом из последовательности.

implicit

Логическое значение, TRUE если /.*/ было неявным образом преобразовано в /^.*/.

anchored/floating

Строка байтов, представляющая якорную или плавающую подстроку соответственно, которую должно содержать любое совпадение, или undef, если такая подстрока не найдена или подстрока требует utf8 для представления.

anchored utf8/floating utf8

UTF-8 строка, представляющая якорную или плавающую подстроку соответственно, которую должно содержать любое совпадение, или undef, если такая подстрока не найдена или подстрока содержит только символы ASCII 7-битного кода.

anchored min offset/floating min offset

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

anchored max offset/floating max offset

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

Игнорируется для якорного, поэтому может быть 0 или таким же, как min.

anchored end shift/floating end shift

FIXME: не уверен, что это такое, что-то связанное с lookbehind. regcomp.c говорит: Когда окончательный шаблон скомпилирован, и данные перемещаются из структуры scan_data_t в структуру regexp, информация о lookbehind учитывается, при этом информация, которая была потеряна, предварительно вычисляется в поле end_shift для соответствующей строки.

checking

Постоянная строка, одна из "anchored", "floating" или "none", указывающая, какая подстрока (если есть) должна проверяться в первую очередь.

stclass

Строковое представление класса символов ("стартовый класс"), который должен быть первым символом любого совпадения.

TODO: объяснить представления.

СМОТРИТЕ ТАКЖЕ

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

© 1993–2021 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.34.0/re

Spec-Zone.ru

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