Язык программирования Perl
Шрифт:
В огромном числе случаев ввод данных в Perl-программу и вывод из нее результатов производится построчно, а для разделения строк файла используется разделитель входных записей, хранящийся в специальной переменной $/ ($INPUT_RECORD_SEPARATOR). Для чтения одной строки из входного потока используется операция "кристалл" (diamond), которой в качестве аргумента передается файловый манипулятор или переменная, содержащая манипулятор. Если аргумент не указан, данные читаются из стандартного входного потока.
Операция чтения "кристалл" в скалярном контексте возвращает одну строку вместе с разделителем записей, а когда достигается конец файла, она
Операция чтения "кристалл" в списочном контексте возвращает список всех строк с разделителями записей. Так, например, можно считать файл в массив, попутно отсортировав его:
Построчный вывод данных выполняет функция print, которая по умолчанию выводит список значений в текущий поток вывода, по умолчанию - в STDOUT. Если требуется направить информацию в другой поток, то перед списком выводимых данных указывается файловый дескриптор. Обратите внимание, что между файловым дескриптором и списком выводимых значений запятая не ставится. Вот примеры вывода данных:
Для форматирования выводимой информации применяется функция printf, которая преобразует выходные данные при помощи форматов преобразования, подробно объясненных в лекции 7 при описании функции sprintf. Например, так можно вывести отформатированное текущее время в разные выходные потоки:
Задавая различные форматы преобразования, можно выводить данные в требуемом представлении или в виде колонок указанной ширины. Более тонкое управление выводимыми данными организуется средствами форматирования отчетов, которые будут изучены в следующей лекции.
В файле с исходным текстом программы на Perl может располагаться встроенный файл с данными, которые помещаются в конце программного файла после специальной лексемы __END__ (в основной программе) или __DATA__ (в программном модуле). При выполнении программы данные из этого встроенного файла доступны для чтения при помощи специального файлового манипулятора DATA. Во встроенном файле удобно хранить тестовые данные для проверки работы программы после ее модификации. Вот пример чтения данных из встроенного файла:
Двоичные данные обычно хранятся в файлах без разделителей записей в блоках фиксированной длины. После открытия двоичного файла функцией open нужно установить режим обработки двоичных данных с помощью функции binmode.
Запись двоичных
данных или данных фиксированной длины может выполняться с помощью функции print($fh $record). Также имеется функция небуферизованного вывода syswrite, которой при вызове указываются три аргумента: файловый манипулятор, скалярная переменная с выводимыми данными и размер записываемого блока данных. Эта функция возвращает число фактически записанных байт (в случае ошибки syswrite возвращает undef), что можно использовать для проверки успешности записи. Это делается так:Преобразование данных к двоичному виду производит функция pack, которая упаковывает в скалярную переменную список значений в соответствии с указанным шаблоном. В шаблоне каждое преобразуемое поле обозначается с помощью латинской буквы. Полный перечень шаблонов преобразования для функций pack и unpack приводится в таблице 9.2. За каждым символом в шаблоне может следовать десятичное число, которое рассматривается как ширина преобразуемого поля. Поля в шаблоне могут разделяться пробелами для удобства чтения.
Таблица 9.2. Шаблоны упаковки и распаковки данных
| Шаблон | Мнемоника | Описание преобразования |
|---|---|---|
| a | Arbitrary | произвольная последовательность байтов, дополненная нулевым байтом \0 |
| A | ASCII | строка символов ASCII, дополненная пробелами |
| b / B | Bit string | строка битов с возрастающим / убывающим порядком битов |
| c / C | Character | однобайтовые символы со знаком / без знака |
| f / d | Float / Double | число с плавающей точкой одинарной / двойной точности |
| F | Float | число с плавающей точкой одинарной точности во внутреннем представлении (NV) |
| D | long Double | длинное число с плавающей точкой двойной точности |
| h / H | Hex string | шестнадцатеричная строка с младшим / старшим полубайтом (nybble) в начале |
| i / I | Integer | целое (>=32 бита) число со знаком / без знака |
| j / J | целое во внутреннем представлении со знаком (IV) / без знака (UV) | |
| l / L | Long | длинное (32 бита) целое со знаком / без знака |
| n / N | Network | беззнаковое короткое (16 битов) / длинное (32 бита) целое с сетевым порядком байтов (big endian) |
| p / P | Pointer | указатель на строку, оканчивающуюся \0 / фиксированной длины |
| q / Q | Quad | сверхдлинное (64 бита) целое число со знаком / без знака |
| s / S | Short | короткое (16 битов) целое со знаком / без знака |
| u | uuencoded | строка, кодированная по алгоритму uuencode |
| U | Unicode | строка символов Unicode |
| v / V | VAX | беззнаковое короткое (16 битов) / длинное (32 бита) целое с VAX-порядком байтов (little endian) |
| w | целое, сжатое в соответствии с кодировкой BER | |
| x | вставка \0 (pack) / пропуск байта по направлению вперед (unpack) | |
| X | пропуск байта по направлению назад | |
| Z | ASCIIZ | строка ASCIIZ (оканчивающаяся \0), дополненная \0 |
| @ | заполнение \0 до указанной позиции |