Spec-Zone.ru › Perl 5.28

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} в виде списка через запятую 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

Spec-Zone.ru

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