re
СОДЕРЖАНИЕ
ИМЯ
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' включён, регулярное выражение разрешается содержать (?{ ... }) утверждения нулевой ширины и (??{ ... }) отложенные подвыражения, которые получены из интерполяции переменных, а не появляются буквально в регулярном выражении. Это обычно запрещено, поскольку представляет потенциальную угрозу безопасности. Обратите внимание, что этот pragma игнорируется, когда регулярное выражение получено из заражённых данных, т.е. вычисление всегда запрещено для заражённых регулярных выражений. См. "(?{ code })" в perlre и "(??{ code })" в perlre.
Для целей этого pragmy интерполяция предварительно скомпилированных регулярных выражений (т.е. результат 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'
Если указаны флаги, то эти флаги автоматически добавляются к каждому регулярному выражению до конца лексической области видимости. Флаги могут быть любой комбинацией '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, для регулярных выражений. Отключение одного из этих флагов, когда он активен, возвращает поведение, указанное любыми другими pragmas, которые находятся в области видимости. Например:
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 для получения дополнительной информации.
ПРИМЕЧАНИЕ, что точный формат режима debug НЕ считается официально поддерживаемой API Perl. Он предназначен только для отладки и может меняться по усмотрению основной команды разработки без предварительного уведомления или deprecation в любом релизе Perl, крупном или малом. Любая документация о выводе является исключительно справочной.
Начиная с версии 5.9.5, директива use re 'debug' и её аналоги имеют лексическую область видимости, как и другие директивы. Однако они оказывают как compile-time, так и run-time влияние.
См. "Pragmatic Modules" в perlmodlib.
Режим 'Debug'
Аналогично, use re 'Debug' производит вывод отладки, различие заключается в том, что он позволяет утончить то, какой вывод отладки будет выводиться. Параметры разделены на три группы: те, которые относятся к компиляции, те, которые относятся к выполнению, и те, которые относятся к специальным целям.
ПРИМЕЧАНИЕ, что параметры, предоставляемые в режиме Debug, и точный формат выводимой информации НЕ считаются официально поддерживаемой API Perl. Они предназначены только для отладки и могут изменяться по усмотрению основной команды разработки без предварительного уведомления или deprecation в любом релизе Perl, крупном или малом. Любая документация о формате или доступных параметрах носит исключительно справочный характер и может быть изменена без предварительного уведомления.
Параметры следующие:
-
- COMPILE
-
Включает все параметры отладки, связанные с компиляцией, кроме дополнительных.
- PARSE
-
Включает вывод отладки, связанный с процессом разбора шаблона.
- OPTIMISE
-
Включает вывод, связанный с фазой оптимизации компиляции.
- TRIEC
-
Подробная информация о компиляции trie.
- DUMP
-
Выводит итоговую программу после компиляции и оптимизации.
- FLAGS
-
Выводит флаги, связанные с программой.
- TEST
-
Выводит вывод, предназначенный для тестирования внутренних процессов компиляции.
-
- EXECUTE
-
Включает все параметры отладки, связанные с выполнением, кроме дополнительных.
- MATCH
-
Включает отладку основного цикла сопоставления.
- TRIEE
-
Дополнительная отладка выполнения trie.
- INTUIT
-
Включить отладку оптимизаций начальной точки.
- Дополнительные параметры отладки
-
- EXTRA
-
Включает все дополнительные параметры отладки.
- BUFFERS
-
Включить отладку хранения групп захвата во время сопоставления. Предупреждение: это может потенциально привести к очень большому выводу.
- TRIEM
-
Включить расширенную отладку TRIE. Расширяет как TRIEE, так и TRIEC.
- STATE
-
Включить отладку состояний в движке.
- STACK
-
Включить отладку стека рекурсии в движке. Включение или выключение этого параметра автоматически выполняет то же самое для отладки состояний. Вывод от этой опции может быть довольно большим.
- GPOS
-
Включить отладку модификатора \G.
- OPTIMISEM
-
Включить расширенную отладку оптимизации и оптимизации начальной точки. Вероятно, бесполезно, кроме как при отладке самого движка регулярных выражений.
- DUMP_PRE_OPTIMIZE
-
Включить выгрузку скомпилированного шаблона перед фазой оптимизации.
- WILDCARD
-
Когда Perl сталкивается с подшаблоном-подстановкой (см. "Подстановки в значениях свойств" в perlunicode), он приостанавливает компиляцию основного шаблона, компилирует подшаблон и затем сопоставляет его со всеми допустимыми возможностями, чтобы определить фактические код-точки, с которыми подшаблон совпадает. После этого он добавляет эти значения в основной шаблон и продолжает компиляцию.
Вам может потребоваться увидеть, как компилируется ваш подшаблон, но, вероятно, менее полезно видеть, как Perl сопоставляет его со всеми допустимыми вариантами, так как это контролируется Perl, а не вами. Поэтому информация об отладке части компиляции задается другими параметрами, но вывод отладки части сопоставления обычно подавляется.
Вы можете использовать параметр WILDCARD, чтобы включить вывод отладки этого сопоставления подшаблонов. Осторожно! Это может привести к обширному выводу, и может быть непонятно, что и почему Perl делает то, что делает. Но это может быть полезно, чтобы понять, почему вещи не идут так, как вы ожидаете.
Обратите внимание, что этот параметр сам по себе не вызывает вывод никакой отладочной информации. То, что он делает, — это прекращает обычное подавление информации об отладке выполнения во время части сопоставления при компиляции подстановок. Вам также необходимо указать, какую информацию об отладке выполнения вы хотите, например, включив также параметр EXECUTE.
- Другие полезные флаги
-
Это полезные сокращения, чтобы сэкономить на наборе текста.
- ALL
-
Включает все параметры, за исключением 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, если нет.Эта функция не будет введена в заблуждение перегрузкой или благословлением. Внутренне она извлекает указатель на regexp из структуры 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 истинно, то возвращает массив ссылок, содержащий по одному элементу на каждый буфер; в противном случае возвращает первый определённый буфер.
- regnames($all)
-
Возвращает список всех именованных буферов, определённых в последнем успешном совпадении. Если $all истинно, то возвращает все определённые имена; в противном случае возвращает только имена, которые участвовали в совпадении.
- 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
-
Строка utf8, представляющая якорящуюся или плавающую подстроку соответственно, которая должна присутствовать в любом совпадении, или undef, если такая подстрока не найдена или подстрока содержит только символы 7-битного ASCII.
- anchored min offset/floating min offset
-
Целое число, первое смещение в символах от расположения совпадения, в котором мы должны искать соответствующую подстроку.
- anchored max offset/floating max offset
-
Целое число, последнее смещение в символах от расположения совпадения, в котором мы должны искать соответствующую подстроку.
Игнорируется для якорящегося, поэтому может быть 0 или таким же, как минимум.
- 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–2023 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.38.0/re