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