Поиск

Простые шаблоны

В Perl шаблоны помешаются в оператор поиска по шаблону, который обычно выглядит как т/л вот пример простого шаблона:

Этот шаблон соответствует последовательности букв S-i-m-o-n. Но вот только где он ищет эту последовательность? Ранее вы узнали, что в Perl часто используется стандартная переменная $_. Так вот, поиск по шаблону происходит в переменной $_, если не будет указана другая переменная (об этом мы поговорим позже). Итак, предыдущий шаблон ишет последовательность символов S-i-m-o-n в скалярной переменной $_.

Если в переменной $_ найдена строка, соответствующая шаблону, оператор т// возвращает истинное значение. Поэтому обычно поиск по шаблону используют в условных выражениях, как показано ниже:

Внутри шаблона каждый символ соответствует самому себе, если только это не метасимвол. Большинство обычных символов (буквы и цифры) соответствуют сами себе. Метасимволы — это символы, изменяющие поведение шаблонов. Вот список метасимволов:

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

m/Я честно выиграл /; | $ в данном случае "$" не метасимвол, а просто знак доллара.

Оператор поиска по шаблону обычно имеет вид m//. Тем не менее в нем можно заменить символы косой черты на любой другой символ, как в следующем примере:

Подобная замена символов часто делается, если в шаблоне есть символы косой черты, что может привести к неправильному определению конца шаблона. Поэтому перед вложенным символом косой черты должен быть символ обратной косой черты, например:

Этот же пример можно переписать в более читабельном виде:

В операторе поиска по шаблону можно обойтись и без префикса m, если в качестве ограничителей шаблона используются символы косой черты. Так, вместо m/Cheetos/ можно написать /Cheetos/. Обычно, если не нужно заменять символ-ограничитель, так и поступают.

В регулярных выражениях можно использовать переменные. Встретив в регулярном выражении имя переменной, Perl сначала вычисляет значение этой переменной, а затем уже использует получившийся шаблон. Это позволяет создавать регулярные выражения на ходу. В приведенном ниже примере регулярное выражение, используемое в операторе if, считывается с клавиатуры:

Для обозначения регулярных выражений в руководстве и документации часто используются сокращения RE или regехр. Для ясности мы будем по-прежнему называть их регулярными выражениями.
Правила игры

Прежде чем применять регулярные выражения в Perl, сначала нужно узнать, как они используются. Этих правил немного. Все они возникли не на пустом месте, а имеют определенный смысл. Вот они.

  • Обычно поиск по шаблону в строке ведется слева направо.
  • Выражение, в котором задан шаблон, возвращает истинное значение (в любом контексте) тогда и только тогда, когда в строке найден текст, полностью соответствующий шаблону.
  • Поиск соответствия шаблону выполняется в строке слева направо. Таким образом, первым будет найден текст, расположенный ближе к началу строки. Однако это совсем не означает, что следующие соответствия шаблону найдены не будут. Хотя существуют и исключения...
  • Прежде всего программа пытается найти самую длинную строку, соответствующую шаблону. Обнаружив первое совпадение, Perl просматривает всю строку до конца в поиске более длинной фразы, соответствующей заданному шаблону. Для описания этого свойства регулярных выражений придуман специальный термин — "жадность" регулярных выражений.