Язык программирования Perl
Шрифт:
Регулярные выражения часто применяются в функциях, работающих с массивами для фильтрации нужных элементов. Например, функция 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, который можно прочитать утилитой чтения документации:
Связь файлового манипулятора в программе с обрабатываемым файлом разрывается функцией закрытия потока close, закрывающей поток ввода-вывода. Ей передается файловый манипулятор открытого файла:
В новой многоуровневой подсистеме ввода-вывода Perl предусматривает при открытии потока вместе с режимом открытия указывать кодировку читаемых и записываемых данных, что позволяет автоматически преобразовывать информацию из одной кодировки в другую, например, так:
В некоторых операционных системах (например, в MS-DOS), после открытия файла, но перед чтением двоичных данных требуется установить для файлового манипулятора режим работы с двоичными данными с помощью функции binmode($file_handle). При работе в операционных системах, не требующих установки этого режима, вызов функции binmode не оказывает никакого действия.