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

Практическое использование операторов m// и s///

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

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
< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия