re
СОДЕРЖАНИЕ
НАЗВАНИЕ
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} в виде списка через запятую termcap свойств для включения/выключения выделения строк, включения/выключения части перед точкой. См. "Debugging Regular Expressions" в perldebug для дополнительной информации.
Начиная с версии 5.9.5, директива use re 'debug' и её эквиваленты имеют лексическую область действия, как и другие директивы. Однако они влияют как на время компиляции, так и на время выполнения.
См. "Pragmatic Modules" в 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.)
- 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.28.3/re