Язык программирования Perl
Шрифт:
Регулярные выражения применяются во многих конструкциях. В функции 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 помещает в свой первый аргумент готовый к использованию файловый манипулятор. Имя файлового манипулятора записывается без разыменовывающего префикса и по традиции выделяется заглавными буквами. Рекомендуется при открытии файла сохранять файловый манипулятор в скалярной переменной, что позволяет локализовать файловый манипулятор для использования только в текущем блоке или подпрограмме. Кроме того, скалярную переменную с файловым манипулятором можно удобно передавать в подпрограммы для выполнения в них операций ввода-вывода. Итак, вот предпочтительный способ открытия файла:
(Как и при вызове других функций в 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') |
Применяются две формы записи функции open: старая с двумя аргументами, когда режим открытия указывается перед именем файла, и новая - с тремя аргументами, в которой режим открытия указывается отдельно вторым параметром. Сравните:
Программисты, знающие язык C, могут воспользоваться для открытия потоков функцией sysopen, которая аналогична функции открытия потоков в C, и к тому же позволяет более тонко настраивать режимы открытия файлов. А вообще в комплекте с Perl идет целый учебник по функции open, который можно прочитать утилитой чтения документации: