Шрифт:
Регулярные выражения часто применяются в функциях, работающих с массивами для фильтрации нужных элементов. Например, функция 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 помещает в свой первый аргумент готовый к использованию файловый манипулятор. Имя файлового манипулятора записывается без разыменовывающего префикса и по традиции выделяется заглавными буквами. Рекомендуется при открытии файла сохранять файловый манипулятор в скалярной переменной, что позволяет локализовать файловый манипулятор для использования только в текущем блоке или подпрограмме. Кроме того, скалярную переменную с файловым манипулятором можно удобно передавать в подпрограммы для выполнения в них операций ввода-вывода. Итак, вот предпочтительный способ открытия файла:
(Как и при вызове других функций в Perl, если не возникает неоднозначности, программист решает, заключать аргументы функций в круглые скобки или нет. Среди пишущих на Perl широко распространен стиль программирования без использования круглых скобок.)
При открытии файла функции, помимо файлового манипулятора и имени файла в файловой системе (абсолютного или относительного), указывается режим открытия файла. Он обозначается такими же символами, как переназначение потоков ввода-вывода в командном интерпретаторе операционной системы. Основные режимы открытия потоков ввода-вывода приведены в таблице 9.1.
Таблица 9.1. Основные режимы открытия потоков ввода-вывода
Обозначение | Режим открытия | Пример использования |
---|---|---|
< | Чтение (существующего файла с начала) | open($fh, '</temp/buffer.txt') |
> | Перезапись (с начала файла) | open($fh, '>/temp/buffer.txt') |
>> | Дозапись (в конец файла) | open($fh, '>>/temp/buffer.txt') |
+< | Чтение и запись (файл должен существовать) | open($fh, '+</temp/buffer.txt') |
+> | Запись и чтение (файл усекается) | open($fh, '+>/temp/buffer.txt') |
+>> | Дозапись и чтение | open($fh, '+>>/temp/buffer.txt') |