Практическое использование операторов m// и s///
5.3. Привязка к началу и концу строк и текста
Мнимые символы \A, \Z и \z не зависят от установок модификаторов и работают всегда одинаково. Не таковы якоря ^ и $, работа которых зависит от модификатора m. В зоне, где модификатор m отключен, якорь ^ соответствует якорю \A, а якорь $ - якорю \Z. Рассмотрим такой пример:
$_="a\r\n"; print '1' if m'a\r$\n';
Здесь я использовал в качестве ограничителей регулярного выражения апострофы, чтобы не было попытки интерполяции специальной переменной $\. Метасимвол $ стоит перед символом \n, который является последним в тексте, и на печать выйдет единица.
Если переставить символ $ перед символом \r:
$_="a\r\n"; print '1' if m'a$\r\n';
то поиск закончится неудачей, потому что здесь $ не стоит непосредственно перед символом \n.
Теперь вернемся к первому примеру и добавим в конце текста какой-нибудь символ:
$_="a\r\nb"; print '1' if m'a\r$\n';
В этом случае поиск вновь завершится неудачно, потому что символ \n здесь уже не последний в тексте. Но если поставить модификатор m, то поиск закончится удачей:
$_="a\r\nb"; print '1' if m'a\r$\n'm;
Теперь такой пример:
$_="a\n"; print '1' if /a\n^/m;
Единица напечатана не будет, потому что якорь ^ не совпадает после символа \n, если он стоит последним в тексте, и модификатор m здесь не поможет. Но если после \n поставить еще символ:
$_="a\n\n"; print '1' if m'a\n^'m;
то совпадение будет найдено. Теперь в последнем примере уберем модификатор m:
$_="a\n\n"; print '1' if /a\n^/;
Совпадения шаблона тексту уже не будет, т.к. без модификатора m якорь ^ совпадает только в начале текста.
5.4. Поиск множественных совпадений
Для поиска множественных совпадений можно применить модификатор g и скалярный контекст. Например:
while ('12345' =~ /\d/g) { print "Найдена еще цифра: $&\n" }
Будет напечатано:
Найдена еще цифра: 1 Найдена еще цифра: 2 Найдена еще цифра: 3 Найдена еще цифра: 4 Найдена еще цифра: 5
Иногда для поиска множественных совпадений нужно искать следующее сразу от конца предыдущего совпадения, аналогично привязке к началу текста \A. Для этого есть специальный якорь \G, о котором мы поговорим позже.
Модификатор g и списковый контекст позволяет запомнить сразу все совпадения в тексте:
my @a='12345' =~ /\d/g; print join ',',@a;
Получаем
1,2,3,4,5