Операторы 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, чтобы избежать его многократной компиляции. Этот модификатор может стоять только после всего регулярного выражения.