Язык программирования Perl
Шрифт:
Все, что говорилось до этого про операцию сопоставления, применимо для левой части операции замены, в которой указывается образец поиска. Левая и правая части операции замены интерполируются, поэтому там могут использоваться escape-последовательности и переменные.
В правой части операции замены могут использоваться обратные ссылки на найденные значения. Так, например, можно поменять местами два крайних слова в тройке слов, разделенных пробельными символами:
Для операции замены s/// можно применять все модификаторы, упомянутые
У операции замены есть дополнительный модификатор /e (expression evaluation), при включении которого заменяющая часть вычисляется как выражение. При этом в заменяющей части можно использовать ссылки на захваченные при помощи круглых скобок соответствия. Это можно применять для более "интеллектуальной" замены найденных соответствий. Так, например, можно перевести температуру из шкалы Цельсия в шкалу Фаренгейта:
Регулярные выражения применяются во многих конструкциях. В функции split первым параметром может использоваться регулярное выражение, которое будет служить для поиска разделителей при разделении строки на части. Так, например, можно разбить строку на подстроки по любому из пробельных символов:
Регулярные выражения часто применяются в функциях, работающих с массивами для фильтрации нужных элементов. Например, функция grep возвратит список элементов массива, соответствующих указанному образцу:
С помощью функции map можно применить операцию замены в соответствии с регулярным выражением ко всем элементам массива, например:
Регулярные выражения дают программисту новый взгляд на текстовые данные: вместо отдельных символов и простых подстрок он начинает мыслить обобщенными шаблонами, что помогает ему находить более простые и эффективные решения. В таблице 8.1 для справки приведены основные обозначения, применяемые для записи регулярных выражений в Perl. Дополнительные сведения о регулярных выражениях можно почерпнуть из стандартной документации по Perl и перевода уникальной книги Джеффри Фридла "Регулярные выражения".
Таблица 8.1. Основные обозначения для записи регулярных выражений
Обозначение | Описание | Примеры |
---|---|---|
// | ограничители регулярного выражения по умолчанию | /$pattern/ |
\ | отмена специального значения следующего символа | m{C:\\windows} |
группировка шаблонов или сохранение значения | /(\w\w\w)+/ | |
| | выбор из нескольких альтернатив | /кошелек|жизнь/ |
[] | класс символов: любой символ из перечисленных | /[0-9a-fA-F]/ |
[^] | инвертированный класс символов: любой символ, кроме перечисленных | /[^0-9]/ |
Метасимволы | ||
. | любой символ, кроме \n (соответствует любому символу, включая \n с модификатором /s) | /(.+)/ |
\d | десятичная цифра | m{Время=\d+ сек} |
\D | не десятичная цифра | /(\D*)\d+/ |
\w | алфавитно-цифровой знак | /\s+\w+\s+/ |
\W | не алфавитно-цифровой знак | /\W\W\W/ |
\s | пробельный символ | s/\s+/ / |
\S | любой символ, кроме пробельного | /\S+/ |
Утверждения | ||
^ | начало строки (соответствует началу каждой строки с модификатором /m) | /^\w+/ |
$ | конец строки (соответствует концу каждой строки с модификатором /m) | /\d+$/ |
\b | граница слова (между \w и \W или \W и \w) | /stop\b/ |
\B | любая
| /stop\B/ |
\A | только начало строки, даже с модификатором /m | /\A[#]/ |
\z | только конец строки, даже с модификатором /m | /\w+\z/ |
\Z | только конец строки или перед \n в конце строки, даже с модификатором /m | /\w+\Z/ |
\G | позиция в строке, равная значению функции pos | |
Escape-последовательности | ||
\t \n \r \f \a \b | управляющие символы: \b в классе символов выступает как символ Backspace (0x08), вне его - как граница слова | /[\a\b\f\r\n\t]/ |
\0 \x \c \N | коды символов | /\033\x1F\cZ/ /\x{263a}/ |
\l \L \u \U \Q \E | преобразующие последовательности | /\Q$pattern\E/ |
Квантификаторы | ||
* *? | любое число повторений, включая 0 (максимальный и минимальный квантификаторы) | /\s*/ /\S*?/ |
+ +? | одно и более повторений (максимальный и минимальный квантификаторы) | /\d+/ /\D+?/ |
? ?? | ноль или одно повторение (максимальный и минимальный квантификаторы) | /.?/ /[.a-z]??/ |
{n} {n}? | ровно n повторений (максимальный и минимальный квантификаторы) | /\w{8}/ /\w{5}?/ |
{n,} {n,}? | n и более повторений (максимальный и минимальный квантификаторы) | /\d{2,}/ /\d{5,}?/ |
{n,m} {n,m}? | от n до m повторений включительно (максимальный и минимальный квантификаторы) | /[A-Z]{1,12}/ /[a-z]{0,3}?/ |
Из этой лекции вы узнали о регулярных выражениях далеко не все, но достаточно, чтобы начать свободно пользоваться ими. По мере накопления опыта применения языка Perl, регулярные выражения станут вашим привычным и надежным инструментом. И тогда задачи, при другом подходе требующие много времени и больших усилий, с помощью регулярных выражений будут решаться быстро, элегантно и эффективно.
Лекция 9. Средства ввода-вывода
В этой лекции разбирается организация ввода-вывода данных в Perl. Рассмотрены средства работы с каталогами, файлами и содержимым файлов. Материалы этой лекции позволят вам писать полноценные программы, "общающиеся с внешним миром".
Цель лекции: познакомиться с возможностями подсистемы ввода-вывода в Perl и освоить основные приемы чтения и записи внешних данных, а также научиться работать со средствами манипулирования файлами и каталогами.
Система ввода-вывода Perl основана на принципах, заложенных в системе Unix и распространившихся на все современные операционные системы. Одним из основных понятий работы в программе с внешними данными являются потоки ввода-вывода. В программе обращение к потоку ввода-вывода производится через файловый манипулятор (file handle), иногда неправильно называемый дескриптором файла. При запуске любой программы автоматически открывается три потока: стандартный ввод (stdin), стандартный вывод (stdout) и стандартный протокол (stderr). Поток стандартного ввода в диалоговой операционной среде связывается с клавиатурной, а потоки стандартного вывода и стандартного протокола - с дисплейной частью консоли операционной системы. Со стандартными потоками в Perl связываются три предопределенных файловых манипулятора: соответственно STDIN, STDOUT и STDERR. Связывание имени файла с пользовательским файловым манипулятором в программе выполняется с помощью операции open, открывающей поток обмена данными с указанным файлом. Требования надежности рекомендуют обязательно проверять все операции ввода-вывода на успешное завершение. Поэтому в случае возникновения ошибки при открытии файла программа обычно аварийно завершается с помощью функции die, которая может выводить диагностическое сообщение в стандартный поток протокола. Например, так открывается файл и создается файловый манипулятор FILE_HANDLE:
В случае успешного открытия файла функция open помещает в свой первый аргумент готовый к использованию файловый манипулятор. Имя файлового манипулятора записывается без разыменовывающего префикса и по традиции выделяется заглавными буквами. Рекомендуется при открытии файла сохранять файловый манипулятор в скалярной переменной, что позволяет локализовать файловый манипулятор для использования только в текущем блоке или подпрограмме. Кроме того, скалярную переменную с файловым манипулятором можно удобно передавать в подпрограммы для выполнения в них операций ввода-вывода. Итак, вот предпочтительный способ открытия файла: