Практическое использование операторов m// и s///
5.6 Применение якорей, проверки текста до и после шаблона
Для привязки к началу текста можно использовать якорь \A или ^ без модификатора m.
Вот как можно проверить, что текст не начинается с точки:
if ($text =~ /^\./) { print "Текст не должен начинаться с точки!" }
Так можно вставить по одному пробелу в начало каждой строки текста:
$_=<<EOF; Первая строка. Вторая строка. Третья строка. EOF s/^/ /gm;
Без модификатора m пробел будет вставлен лишь в начало первой строки.
Пустые строки удаляются оператором замены с таким регулярным выражением:
$_=<<EOF; Первая строка. Вторая строка. Третья строка. EOF s/^\n//gm; print $_;
Получаем на выходе:
Первая строка. Вторая строка. Третья строка.
Может показаться, что оператор s/^$//gm тоже должен удалить пустые строки, но он не сделает замены. Удалиться должен реальный символ, а не совпадение с началом и концом строки, поэтому сперва он должен быть найден. А что-то вставить в пустую строку таким оператором s вполне возможно.
При преобразовании текста в HTML нужно заменять символы & на & Это делается просто:
s/&/&/g
ведь амперсанд не является метасимволом в регулярных выражениях.
Предположим, что нам надо найти последнее число в большом тексте. Здесь можно воспользоваться таким приемом: использовать конструкцию .* с модификатором s, которая мгновенно захватит весь текст и выйдет на его конец. Т.к. совпадение с числом не будет найдено, то квантификатор * будет отдавать по одному символу, пока не отыщется совпадение. Как будто все просто. Попробуем такой пример:
$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF /.*(\d+)/s; print $1;
На печать выходит лишь цифра девять: 9. Удивлены? Квантификатор вернул несколько символов, и текущая позиция в тексте оказалась на цифре 9. Этого достаточно для совпадения шаблона \d+. Чтобы получить правильный результат, надо потребовать, чтобы перед подшаблоном \d+ не было цифры:
$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF /.*(?<!\d)(\d+)/s; print $1;
Печатает 789.
Чтобы привязать шаблон к концу текста, можно воспользоваться якорями \z (для привязки к истинному концу текста) или \Z ( $ без модификатора m ):
$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789 EOF /(\d+)$/; print $1;
Печатает 789. Как видим, привязка к концу текста нашла последнее число без захвата всего текста и без заглядывания назад. Но если после последнего числа могут быть символы, то регулярное выражение требуется усложнить:
$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF /(\d+)\D*$/; print $1;
Опять получаем 789, но поиск будет медленнее из-за увеличивающегося числа проверок.