Язык программирования Perl

Поиск соответствий


Наверное, чаще всего регулярные выражения используются в операции сопоставления (match operator), которая проверяет, соответствует ли текст указанному образцу. Образец (pattern) - это символьная последовательность для сопоставления, записанная в специальной нотации. Простейший образец - это строковый литерал, представляющий собой последовательность символов, которая будет отыскиваться в тексте. В скалярном контексте операция сопоставления возвращает '1', если образец в строке найден, и пустую строку "', если соответствие образцу не найдено. Для указания, к какой строке применить операцию сопоставления, используется операция привязки =~ к строке:

'В строке образец есть' =~ /образец/; # образец найден

Обычно поиск образца выполняется с учетом регистра, но можно игнорировать регистр при сопоставлении строки с образцом, если в операции сопоставления задать модификатор /i (ignore case). Для корректной обработки национальных букв должна быть включена прагма use locale. Например:

use locale; 'В строке образец есть' =~ /Образец/; # образец НЕ найден! 'В строке образец есть' =~ /Образец/i; # образец найден

Результат операции сопоставления в тексте можно присвоить скалярной переменной или использовать в любой из условных конструкций, например:

$text = 'Черный кот в темной комнате'; # ищем в этом тексте $found = $text =~ /кот/; # в $found будет '1' print 'Кошки нет!' unless $text =~ /кошка/; # вернет ''

Последнее предложение можно переписать, применив операцию отрицательной привязки к строке (!~), которая инвертирует (меняет на обратный) результат операции сопоставления:

print 'Кошки нет!' if $text !~ /кошка/; вернет '1'

Если операция привязки к строке не используется, образец отыскивается в переменной по умолчанию $_. Выражение перед поиском интерполируется, поэтому весь образец поиска или его часть может содержаться в переменной. Например:

$_ = 'Счастье - это когда тебя понимают.'; # переменная поиска $pattern = 'Счастье'; # образец для сопоставления print "$pattern найдено!" if /$pattern/;


В составе образца поиска могут применяться не только переменные, но и escape-последовательности, известные нам из лекции 2, например:

print 'В строке обнаружена табуляция' if $string =~ m{\t};

Для успешного сопоставления строки образцу достаточно найти в строке первое совпадение. В этом примере образец совпадет с началом подстроки 'которого':

$text = 'У которого из котов зеленые глаза?'; # ищем здесь $any = $text =~ /кот/; # образец совпал с 'которого'

Чтобы найти именно подстроку 'кот', перед которой стоит пробел, нужно задать более точный образец для сопоставления:

$cat = $text =~ / кот/; # образец совпадет с ' кот'

В операции сопоставления программист может задавать ограничители для образца: в этом случае перед ограничителями указывается буква m// (Операцию сопоставления часто именно так и называют: операция m//.) В качестве ограничителей могут выступать различного вида скобки или парные небуквенные символы, например:

m($pattern) m{$pattern} m[$pattern] m<$pattern> m|$pattern| m!$pattern! m"$pattern" m#$pattern#

Задать собственные ограничители бывает особенно полезно, когда в шаблон поиска входит наклонная черта. Из двух приведенных вариантов второй смотрится гораздо понятнее:

/\/usr\/bin\/perl/ m{/usr/bin/perl}

Недаром обилие левых и правых наклонных черт в первом варианте называют "ученическим синдромом зубочисток" (LTS - Learning Toothpick Syndrome). В приводимых до сих пор примерах операцию сопоставления с литералом в качестве образца вполне можно заменить вызовом функции index(). Самое интересное начинается тогда, когда в образце поиска применяются метасимволы для сопоставления с шаблоном.


Содержание раздела