Интерполяция в шаблонах

Регулярные выражения поддерживают интерполяцию по правилам строк в кавычках (как если бы они были заключены в кавычки). Это позволяет писать короткие программы «в стиле grep» следующим образом:

#!/usr/bin/perl -w
my $what = "larry";
while (<>) {
if (/^($what)/) { # Шаблон закрепляется в начале строки
print "We saw $what in beginning of $_";
}
}

При выполнении поиска шаблон будет построен из содержимого $what. В данном случае все происходит так же, как если бы мы воспользовались шаблоном /^(larry)/ для поиска последовательности larry в начале каждой строки. Но значение $what необязательно брать из строкового литерала; его можно было бы прочитать из аргументов командной строки в @ARGV:

my $what = shift @ARGV;

Если в первом аргументе командной строки передается текст fred|barney, шаблон превращается в /^(fred|barney)/ и ищет текст fred или barney в начале каждой строки.Круглые скобки (которые были лишними при поиске larry) здесь необходимы; без них шаблон будет искать fred в начале строки или barney в любой позиции. Итак, шаблон получает данные из @ARGV, а сама программа начинает напоминать команду UNIX grep.


Но мы должны принять особые меры предосторожности для метасимволов в строке. Если $what содержит текст 'fred(barney', то в шаблоне появляется непарная скобка /^(fred(barney)/, а программа аварийно завершится с ошибкой регулярного выражения. Используя сложные технические приемы1, можно перехватить ошибки такого рода (или изначально предотвратить особую интерпретацию метасимволов) и устранить опасность сбоя программы. А пока запомните: если вы наделяете своих пользователей силой регулярных выражений, они несут ответственность за их правильное применение.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоматические переменные совпадения
Границы слов
Добавление пропусков (/x)
Другие модификаторы
Жизненный цикл переменных частичных совпадений