Язык программирования Perl
Шрифт:
Например, целочисленное значение, возвращаемое функцией time, и дробное значение, возвращаемое функцией rand, можно упаковать в переменную $record с помощью шаблона 'l1 d1', который означает: "одно длинное целое число (long) и одно число с плавающей точкой двойной точности (double)".
Вот еще несколько несложных примеров использования разных шаблонов для функции pack:
Для преобразования данных из двоичного вида применяется функция unpack, которая распаковывает из скалярной переменной в список или массив значения двоичных данных в соответствии с указанным шаблоном.
Кроме того, с помощью функции unpack можно из строки извлекать подстроки фиксированной длины. Например, так можно извлечь из записи файла поля определенной длины в переменные:
Чтобы пропустить ненужные поля, достаточно указать в шаблоне пропуск определенного количества байтов. Например, так можно не извлекать поле с телефонным номером:
Подробное описание шаблонов и работы функций pack и unpack можно найти в стандартной документации с помощью все той же утилиты чтения документации:
Для чтения двоичных данных или текстовых данных фиксированной длины применяется функция read, которой в качестве аргументов передаются файловый манипулятор, скалярная переменная для вводимых данных и размер считываемого блока данных. Вот так, например, выглядит типичный цикл чтения двоичных данных:
При работе с данными фиксированной длины обычной практикой является считывание или запись данных в произвольном месте файла, например, при изменении только что считанного блока данных. Для этого нужно позиционировать позицию чтения или записи. Это делается с помощью функции seek, которой передается три аргумента: файловый манипулятор, смещение в байтах и указатель позиции отсчета. Позиция отсчета задается числами: 0 - от начала файла, 1 - от текущей позиции, 2 - от конца файла. Например:
С помощью функции tell, которая возвращает смещение относительно начала файла, можно узнать текущую позицию чтения-записи и использовать ее для дальнейших перемещений по файлу.
В следующем примере увеличивается поле счетчика длиной 2 байта, расположенное в файле с позиции $new_pos:
Операции ввода-вывода с произвольным доступом часто используются для работы с базами данных, основанных на записях фиксированной длины, например, с файлами в формате DBF. Они позволяют организовать быструю выборку данных и запись измененных данных на прежнее место.
Перед выполнением операций ввода-вывода часто требуется узнать информацию об объектах файловой системы. В Perl есть набор унарных операций для удобной проверки различных характеристик файлов и каталогов. Они имеют вид флагов из одной латинской буквы с предшествующим знаком минус, после которого указывается имя проверяемого файла. Полный перечень операций проверки файлов приведен в таблице 9.3.
Таблица 9.3. Операции проверки файлов
| Операции | Описание проверок |
|---|---|
| – r -w -x | Файл доступен для чтения / записи / исполнения (по effective UID+GID) |
| – R -W -X | Файл доступен для чтения / записи / исполнения (по real UID+GID) |
| – o -O | Файл принадлежит текущему пользователю по effective / real UID |
| – e -z | Файл существует (exists) / имеет нулевую длину (zero) |
| – s | Файл имеет ненулевой размер: возвращает размер в байтах (size) |
| – f -d | Файл является обычным файлом (file) / каталогом (directory) |
| – l -S -p | Файл является ссылкой / сокетом / именованным FIFO-каналом (pipe) |
| – b -c | Файл является блочным / символьным специальным файлом |
| – u -g -k | Для файла установлен бит setuid / setgid / sticky |
| – t | Файловый манипулятор связан с терминалом (tty) |
| – T -B | Файл является текстовым (text) / двоичным (binary) |
| – M -A -C | Время изменения (modification) / доступа (access) / изменения (change) индексного узла (inode) файла в днях относительно времени начала выполнения программы ($^T) |
Вот несколько типичных примеров использования операций проверки файлов для контроля доступности данных: