Выбрать главу

seek($file, $new_pos, 0); # установить позицию чтения

$pos = tell($file); # и запомнить ее в переменной

read($file, $number, 2); # прочитать 2-байтовое поле

seek($file, $pos, 0); # установить в исходную позицию

syswrite($file, ++$number, 2); # записать новое значение

Операции ввода-вывода с произвольным доступом часто используются для работы с базами данных, основанных на записях фиксированной длины, например, с файлами в формате 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)

Вот несколько типичных примеров использования операций проверки файлов для контроля доступности данных:

open($f1, "<$file1") # открыть файл на чтение,

if (-e $file1) && # если он существует и

(-r $file1); # он доступен на чтение

open $f2, ">$file2" # открыть файл на запись,

if -w $file2; # если в него можно писать

$file_size = -s $file; # узнать размер файла

print "$file - является каталогом!" if -d $file;

В Perl есть целый набор встроенных функций для работы с файлами, с помощью которых можно манипулировать с самими файлами, а не с данными, хранящимися в них.

Функция rename() переименовывает файл, возвращая логическое значение: 1 при успешном изменении имени и 0 - в противном случае. Ей передаются старое и новое имя файла с абсолютным или относительным путем.

$ok = rename("$path/$old_name", "$path/$new_name");

Функция unlink() удаляет файл или список файлов, возвращая число 1 при успешном удалении и 0 - при ошибке.

unlink($list, $of, $files); # удалить список файлов

unlink $file if -e $file; # удалить файл, если он существует

Функция truncate() усекает файл до указанного размера и возвращает число 1 в случае успешного выполнения усечения и неопределенное значение undef - при возникновении ошибки. Файл может задаваться именем или файловым манипулятором. Например:

$ok = truncate($file, $size);

Функция stat() возвращает информацию о файле в виде списка или пустой список при неудаче. Файл может задаваться манипулятором файла или выражением со значением имени файла:

@info = stat($file); # получить всю информацию о файле

$size = $info[7]; # размер файла в байтах

$modified = localtime($info[9]); # время изменения файла

Подробное описание всех элементов информационного списка можно найти в документации, указав утилите чтения документов имя функции следующим образом:

perldoc -f stat

Функция utime() изменяет у файла (или нескольких файлов из заданного списка) время доступа и время модификации, задаваемые числовыми значениями.

utime($access_time, $modified_time, @list_of_files);

Кроме упомянутых, есть еще встроенные функции для изменения прав доступа и владельца файла, для чтения и создания символических и жестких ссылок. Немало разных функций для работы с файлами имеются в стандартной библиотеке модулей Perl, еще больше можно найти в хранилище модулей CPAN.

Помимо работы с файлами, в Perl есть необходимый набор встроенных функций для работы с каталогами. Нужно иметь в виду, что успешность выполнения операций с каталогами зависит от набора прав пользователя, от лица которого выполняется Perl-программа.