Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1354 / 35 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 4:

Операторы m// и s///

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Аннотация: Рассматриваются модификаторы операторов поиска и замены, алгоритм работы опеаторов m// и s///, режимы работы операторов m// и s///, контекст работы оператора m, модификаторы операторов m// и s///, предварительная обработка регулярных выражений.

Оператор m// в общем виде записывается так:

$text =~ m/ регулярное выражение / модификаторы

или

$text !~ m/ регулярное выражение / модификаторы

Второй случай эквивалентен записи

not $text =~ m/ регулярное выражение / модификаторы

при которой возвращаемое значение логически инвертируется.

Целевым текстом по умолчанию является переменная $_. В этом случае ее и связку можно не писать.

$_ =~ m/ регулярное выражение / модификаторы

эквивалентно

m/ регулярное выражение / модификаторы

Если ограничителями являются слэши, то букву m также можно опустить.

Если регулярное выражение не задано, как в операторе

//

или задано в виде пустой или неопределенной переменной:

/$emtyvar/

то в таком операторе в качестве регулярного выражения применяется последнее успешно использованное регулярное выражение во внешней области видимости. Сейчас в связи с появлением объектов регулярных выражений использование регулярного выражения по умолчанию потеряло смысл.

Заскакивая вперед, еще скажу, что регулярное выражение может быть также представлено объектом регулярное выражения:

my $re=qr/ регулярное выражение /;
$text =~ $re;

или

$text =~ /$re/;

Оператор подстановки

$text =~ s/ регулярное выражение / выражение для подстановки / модификаторы

отличается от оператора поиска тем, что имеет заменяющую часть. Кроме того, в операторе подстановки может применяться модификатор e, влекущий вычисление выражения для подстановки как код Perl. Модификатор e может быть использован многократно с многократной обработкой выражения для замены по правилам, аналогичным функции eval, перед тем, как произвести замену.

4.1. Модификаторы операторов m// и s///

Всего в регулярных выражениях используется восемь модификаторов.

  • i - игнорирует различие между заглавными и строчными буквами. На этот модификатор влияет установка локали.
  • s - метасимвол "точка" совпадает со всеми символами, включая символ новой строки \n.
  • m - разрешает привязку метасимволам ^ и $ к промежуточным символам \n в тексте. В этом случае метасимвол ^ совпадает не только в начале текста, как якорь \A, но и после каждого символа \n, который не стоит в самом конце текста. А метасимвол $ начинает совпадать не только в самом конце текста и перед \n, стоящим в самом конце текста, как якорь \Z, но также после каждого символа \n, который не стоит в самом конце текста.
  • x - игнорирует пробельные символы в регулярном выражении, разрешает использовать внутри шаблона комментарии.
  • g - поиск и замена выполняются глобально (в неявном цикле). Подробности мы рассмотрим.
  • c - работает только с модификатором g и только с оператором m//, который применяется в скалярном контексте. Запрещает сбрасывать текущую позицию поиска, когда не удалось найти очередного совпадения. Подробности будут далее.
  • o - шаблон с этим модификатором однократной компиляции транслируется один раз во время компиляции всей программы. Здесь дело в том, что внутри регулярного выражения могут встречаться переменные, которые будут интерполироваться, т.е. их значения будут подставляться в шаблон в качестве литералов. (Не путайте эти переменные с теми, которые присутствуют в исполняемом коде Perl, такие переменные не интерполируются.) Если интерпретатор видит, что происходит интерполяция переменных, то он каждый раз перед использованием этого оператора поиска/замены будет транслировать регулярное выражение во внутреннее представление (байт код). Это может отнять много времени, если такое выражение используется в цикле. Но если вы уверены, что интерполируемая переменная (или массив) не меняет своего значения, то можете поставить к такому регулярному выражению модификатор o, чтобы избежать его многократной компиляции. Этот модификатор может стоять только после всего регулярного выражения.
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия