Глава 6.11. Ввод-вывод, файлы и каталоги

6.11.1. Функции ввода-вывода

Все описанные в этом разделе функции оперируют с описателями файлов (см. п. 6.2.11). Обратите внимание, что PERL поддерживает два уровня ввода-вывода. Ввод-вывод низкого уровня (без буферизации данных) реализован функциями sysread, syswrite и sysseek. Остальные функции ввода-вывода используют внутреннюю буферизацию файлов для ускорения операций чтения и записи и не совместимы с функциями низкого уровня. Иными словами, для каждого открытого нами файла мы должны использовать только одну группу операций: либо буферизованных, либо нет. Смешение функций из этих групп может привести к потере данных.

Функция Описание
binmode Задает двоичный/текстовый режим ввода-вывода.
close Закрывает файл.
eof Проверяет, достигнут ли конец файла.
fileno Возвращает дескриптор открытого файла.
flock Блокирует/разблокирует файл.
getc Читает один символ из файла.
ioctl Операции управления вводом-выводом.
open Открывает заданный файл.
print Выводит в файл строку или список строк.
read Читает блок данных из файла.
readline Читает очередную запись из файла.
seek Изменяет текущую позицию в файле.
select Задает или возвращает указатель файла вывода по умолчанию.
sysopen Открывает заданный файл.
sysread Читает блок данных из файла.
sysseek Изменяет текущую позицию в файле.
syswrite Выводит блок данных в файл.
tell Возвращает текущую позицию в файле.
truncate Изменяет длину заданного файла.

Функция binmode

Синтаксис: binmode файл, режим?
Аргументы: файл — описатель файла
           режим — строковое выражение

Функция binmode задает двоичный или текстовый режим ввода-вывода для указанного файла. Режим задается строкой ":raw" для двоичного режима и ":crlf" для текстового режима. Если этот аргумент опущен, то задается двоичный режим. Данная функция должна вызываться после открытия файла, но до всех операций ввода или вывода с этим файлом.

Разные платформы вкладывают разное содержание в понятия "текстовый файл" и "двоичный файл". В частности, в Unix эти понятия не различаются, а в DOS и Windows текстовые файлы имеют следующие особенности:

  • При чтении текстового файла разделитель строк "\r\n" заменяется на "\n", а при записи выполняется обратное преобразование.
  • Символ "\cZ" при чтении текстового файла воспринимается как конец файла, независимо от того, что хранится после него.

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

open BINFILE, "myfile.dat" or die "Cannot open file: $!\n";
binmode BINFILE;
  . . .
close BINFILE;

Функция close

Синтаксис: close файл?
Аргументы: файл — описатель файла
Результат: логическое значение

Функция eof закрывает указанный файл. Она возвращает истину, если сброс файловых буферов на диск и закрытие файла прошли успешно, и ложь в противном случае. Если аргумент опущен, то закрывается файл, принятый по умолчанию для вывода (см. описание функции select).

Если файл был открыт с перенаправлением вывода, то функция close дожидается завершения работы конвейера и возвращает результат его работы. Пример:

open(OUTPUT, '|sort >temp.tmp') or die "Can't start sort: $!";
  . . . # выводим данные в OUTPUT
close OUTPUT or warn $! ? "Error closing sort pipe: $!" : "Exit status $? from sort";
open(INPUT, 'temp.tmp') or die "Can't open 'temp.tmp' for input: $!";

Функция eof

Синтаксис: eof файл?
           eof()
Аргументы: файл — описатель файла
Результат: логическое значение

Функция eof возвращает 1, если следующее чтение файла обнаружит конец файла или если данный файл не был открыт. В противном случае возвращается 0. Если аргумент опущен, то проверяется файл, из которого производилась последняя операция чтения.

Функция eof() имеет особое назначение. Она относится к псевдофайлу, образованному списком файлов, указанных в командной строке программы, и проверяет наличие входных записей в нем. Подробнее об этом см. описание операции <>.

Данная функция используется редко, поскольку все функции ввода PERL возвращают undef при достижении конца файла или ошибке чтения.

Функция fileno

Синтаксис: fileno файл
Аргументы: файл — описатель файла
Результат: числовое значение

Функция fileno возвращает системный дескриптор файла или undef, если данный файл не был открыт. Обычно она используется в программах, взаимодействующих с функциями, написанными на C. Кроме того, с ее помощью можно проверить, указывают ли два описателя на один и тот же файл:

if (fileno(FILE1) == fileno(FILE2)) {
  . . .
}

Функция flock

Синтаксис: flock файл, операция
Аргументы: файл — описатель файла
           операция — числовое выражение
Результат: логическое значение

Функция flock выполняет заданную операцию блокировки/разблокировки над файлом и возвращает истину в случае успеха и ложь при неудаче. Операция задается числом или символической константой из модуля Fcntl (нужна директива use Fcntl ':flock'):

Символическое имя Число Операция
LOCK_SH 1 Разделяемая блокировка файла.
LOCK_EX 2 Монопольная блокировка файла.
LOCK_NB 4 Не ждать завершения операции блокировки.
LOCK_UN 8 Снятие блокировки файла.

Флаг LOCK_NB употребляется в сочетании с LOCK_SH или LOCK_EX. Если его нет, то функция ждет, пока файл не будет заблокирован; если он установлен, то возврат из функции производится без ожидания (в этом случае мы должны обязательно проверить возвращаемый результат).

В Windows 95/98 эта функция не реализована (вызывает фатальную ошибку). Пример:

use Fcntl ':flock';

open(MYFILE, ">test.txt") or die "Can't create file: $!";
flock(MYFILE, LOCK_EX);
print MYFILE $msg, "\n";
flock(MYFILE, LOCK_UN);

Функция getc

Синтаксис: getc файл?
Аргументы: файл — описатель файла
Результат: строковое значение

Функция getc читает очередной символ из файла или из STDIN, если аргумент опущен. Если STDIN — это клавиатура, то она ждет нажатия клавиши.

Функция ioctl

Синтаксис: ioctl файл, операция, параметр
Аргументы: файл — описатель файла
           операция — числовое выражение
           параметр — скалярное выражение
Результат: числовое значение

Функция ioctl системно-зависима. В Unix она вызывает стандартную функцию C ioctl, предназначенную для управления устройствами ввода-вывода, а в Windows используется только для сокетов и вызывает функцию ioctlsocket, реализованную в Winsock API. Мы не приводим здесь описания этих системных функций, см. документацию на соответствующие операционные системы.

Функция open

Синтаксис: open файл, режим, имя
           open файл, имя?
Аргументы: файл — описатель файла
           режим, имя — строковые выражения
Результат: числовое значение

Функция open выполняет открытие файлов в стиле командного интерпретатора Unix. Имя задает имя открываемого файла. В случае успешного открытия файла его описатель заносится в переменную файл и возвращается ненулевое значение. При неудаче возвращается значение undef. Если имя опущено, то PERL считает, что имя файла хранится в скалярной переменной с тем же именем, что и файл, например:

open(MYFILE, 'test.txt'); # открываем TEXT.TXT

$MYFILE = 'test.txt';
open(MYFILE);             # то же самое

Эта функция имеет два формата. В первом формате параметр режим содержит режим открытия файла, а параметр имя — имя файла. Во втором формате параметр имя содержит и имя файла, и необязательный режим его открытия (сначала режим, затем имя, между ними допустимы пробелы); при этом начальные и конечные пробелы из имени файла удаляются перед его открытием. Режим открытия файла задается следующим образом:

Обозначение Режим открытия файла
'<' или пусто Открывает существующий файл для чтения. Если такого файла нет, возвращает ошибку.
'>' Открывает новый файл для записи. Если такой файл есть, его содержимое удаляется.
'>>' Открывает файл для дозаписи в его конец. Если такого файла нет, то он создается.
'+<' Открывает существующий файл для чтения и записи. Если такого файла нет, возвращает ошибку.
'+>' Открывает новый файл для чтения и записи. Если такой файл есть, его содержимое удаляется.
'+>>' Открывает файл для чтения и дозаписи в его конец. Если такого файла нет, то он создается.
'|-' Имя файла задает программу, на стандартный ввод которой будет перенаправлен вывод в этот файл (только в Unix).
'-|' Имя файла задает программу, стандартный вывод которой будет перенаправлен на чтение из этого файла (только в Unix).

В Windows для создания конвейеров следует использовать альтернативный синтаксис: второй формат функции open, в которой имя файла начинается с символа '|' (эквивалентно режиму '|-') или заканчивается символом '|' (эквивалентно режиму '-|').

Во втором формате команды после режимов '>', '>>', '<', '+>', '+>>', '+<' можно добавить символ '&'. В этом случае остаток строки интерпретируется как имя описателя файла, если это строка, или дескриптор файла, если это число. Этот синтаксис следует традиции командного интерпретатора Bourne и позволяет нам дублировать описатели открытых файлов. Кроме того, в этом формате поддержаны два полезных сокращения: имя файла '-' указывает на STDIN, а '>-' — на STDOUT. Примеры:

open(MYFILE, 'input.txt');       # открывает файл для чтения
open(LOG, '>>mylog');            # открывает протокол для дозаписи
open(DBASE, '+<', 'data.dbf');   # открывает БД для обновления
open(DBASE, '+<data.dbf');       # то же самое
open(SORTED, "|sort >temp.tmp"); # сортировка результатов записи в файл
open(OUT, ">&STDOUT");           # открывает копию STDOUT

open(F, '-|', "cat -n '$file'"); # открывает $file на чтение в Unix
open(F, "cat -n '$file'|");      # то же самое

Функция print

Синтаксис: print файл, список
           print список?
Аргументы: файл — описатель файла
           список — список выражений

Функция print выводит список строк (в частности, одну строку) в заданный файл. Если аргумент файл опущен, то вывод производится в файл, принятый по умолчанию для вывода (см. описание функции select). Если и список опущен, то выводится содержимое специальной переменной $_. Если значение переменной $, не пусто, то оно выводится между элементами списка. Если значение переменной $\ не пусто, то оно выводится после вывода списка. Обратите внимание, что если даже вы передаете этой функции одно выражение для вывода, оно вычисляется в контексте списка. Если файл задается выражением, то вам придется указать блок, который возвращает значение описателя файла. Примеры:

@a = (1, 2, 3);
print @a;      # выводит на STDOUT строку '123'
print 1, 2, 3; # то же самое

$, = ' ';
print MYFILE 'aaa', 'bbb', 'ccc'; # выводит в MYFILE строку 'aaa bbb ccc'

print { $OK ? STDOUT : STDERR } "$message\n";

Функция read

Синтаксис: read файл, скаляр, длина, смещение?
Аргументы: файл — описатель файла
           скаляр — имя скалярной переменной
           длина, смещение — числовые выражения
Результат: числовое значение

Функция read пытается считать из заданного файла количество байтов, заданное аргументом длина. Результат чтения заносится в переменную скаляр как строка байтов. Если задан аргумент смещение, то результат заносится в скаляр как в строку, начиная с ее байта с заданным смещением (отрицательное смещение отсчитывается от конца строки). Эта функция возвращает количество фактически считанных байтов, 0 при попытке чтения в конце файла и undef при ошибке чтения. Пример: допустим, что наш файл TEST.DAT начинается с символов abcdef. Тогда сценарий

open F, 'test.dat';
read F, $x, 5;
print $x;

выведет на экран строку abcde.

Функция readline

Синтаксис: readline файл
Аргументы: файл — typeglob описателя файла
Результат: строковое значение или список строк

Функция readline читает файл с заданным typeglob. В скалярном контексте она считывает очередную запись файла и возвращает ее. В контексте списка она читает файл до конца и возвращает список записей. Ограничитель входных записей задается значением специальной переменной $/. Это внутренняя функция PERLа, реализующая операцию <описатель>, однако вы можете вызывать ее и непосредственно. Например, следующие два оператора эквивалентны:

$line = <STDIN>;
$line = readline(*STDIN);

Функция seek

Синтаксис: seek файл, смещение, начало
Аргументы: файл — описатель файла
           смещение, начало — числовые выражения
Результат: числовое значение

Функция seek изменяет текущую позицию в заданном файле и возвращает 1 в случае успеха и 0 при неудаче. Новая позиция вычисляется на основании параметров начало и смещение в соответствии со следующей таблицей:

начало Новая позиция
Имя Значение
SEEK_SET 0 смещение относительно начала файла
SEEK_CUR 1 текущая позиция + смещение
SEEK_END 2 конец файла + смещение (обычно отрицательное)

Для использования символических имен параметра начало мы должны добавить в наш сценарий директиву use Fcntl ':seek'. Примеры:

use Fcntl ':seek';
seek(FILE, 0, 2);        # позиционируемся на конец файла
seek(FILE, 0, SEEK_END); # то же самое

Функцию seek не следует использовать совместно с sysread и syswrite из-за проблем, связанных с внутренней буферизацией ввода-вывода. В этому случае следует пользоваться функцией sysseek.

Функция select

Синтаксис: select файл?
Аргументы: файл — описатель файла
Результат: описатель файла

Функция select возвращает указатель файла, принятый по умолчанию для вывода. Если параметр файл задан, то он становится новым файлом, принятым для вывода по умолчанию. После этого функции print и write без указания файла вывода будут производить запись в этот файл. Кроме того, специальные переменные, связанные с выводом, теперь будут относиться к этому файлу. Первоначально для вывода по умолчанию принят STDOUT. Следующий пример делает текущим каналом вывода файл REPORT и устанавливает длину страницы вывода для него равной 70 строкам:

select(REPORT); $= = 70;

Приведем еще один пример, показывающий, как включить автоматический сброс на диск буферов файла STDERR:

$old = select(STDERR); $| = 1; select($old);

Функция sysopen

Синтаксис: sysopen файл, имя, режим, права?
Аргументы: файл — описатель файла
           имя — строковое выражение
           режим, доступ — числовые выражения
Результат: числовое значение

Функция sysopen выполняет открытие файлов в стиле языка C. Имя задает имя открываемого файла. В случае успешного открытия файла его описатель заносится в переменную файл и возвращается ненулевое значение. При неудаче возвращается значение undef.

Аргумент режим — это набор битовых флагов, задающий режим открытия файла. Поскольку числовые значения флагов системно-зависимы, следует всегда пользоваться их символическими именами. Для доступа к этим именам необходимо включить в сценарий директиву use Fcntl. Перечислим имена флагов режима открытия файла, которые есть и в Unix, и в Windows:

Имя Значение
O_APPEND Перемещает указатель файла в его конец перед каждой операцией записи.
O_BINARY Открывает файл в двоичном режиме (см. описание функции binmode).
O_CREAT Создает новый файл и открывает его для записи. Если такой файл уже есть, не выполняет никаких действий.
O_EXCL Возвращает ошибку, если файл с таким именем существует. Употребляется только с флагом O_CREAT. Этот флаг сильнее, чем флаг O_TRUNC.
O_RANDOM Открывает файл в режиме произвольного доступа.
O_RDONLY Открывает файл только для чтения. Не может сочетаться с флагами O_RDWR и O_WRONLY.
O_RDWR Открывает файл для чтения и записи. Не может сочетаться с флагами O_RDONLY и O_WRONLY.
O_SEQUENTIAL Открывает файл в режиме последовательного доступа.
O_TEMPORARY Создает временный файл, который будет удален после закрытия последнего указателя на него. Употребляется только с флагом O_CREAT.
O_TEXT Открывает файл в текстовом режиме (см. описание функции binmode).
O_TRUNC Открывает файл и удаляет его содержимое, сбрасывая длину файла в нуль; файл должен быть доступен для записи. Не может сочетаться с флагом O_RDONLY. Вместе с флагом O_CREAT создает новый файл, даже если такой файл уже есть.
O_WRONLY Открывает файл только для записи. Не может сочетаться с флагами O_RDWR и O_RDONLY.

Если режим содержит флаг O_CREAT, т. е. если создается новый файл, то мы можем указать аргумент права. Он задает маску прав доступа к файлу, которая будет установлена при первом закрытии нового файла. Формат этой маски приведен в описании функции umask. По умолчанию она равна восьмеричному числу 0666; это означает, что созданный файл будет доступен для чтения и записи. Примеры:

use Fcntl;
# Открываем существующий фал для чтения
sysopen IN, 'data.txt', O_RDONLY;
# Создаем новый файл. Если он уже есть, то фатальная ошибка.
sysopen OUT, 'data.txt', O_CREAT | O_EXCL or die "Такой файл уже есть!";
# Создаем новый файл. Если он уже есть, то его содержимое теряется.
sysopen OUT, 'data.txt', O_CREAT | O_TRUNC;

Функция sysread

Синтаксис: sysread файл, скаляр, длина, смещение?
Аргументы: файл — описатель файла
           скаляр — имя скалярной переменной
           длина, смещение — числовые выражения
Результат: числовое значение

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

Эта функция полностью аналогична функции read, но с одним важным отличием: чтение производится без внутренней буферизации данных. Поэтому ее нельзя смешивать с функциями read, print, write, seek, tell, eof и т. п. В действительности, эта функция полезна только при чтении данных с последовательных устройств типа терминалов.

Функция sysseek

Синтаксис: sysseek файл, смещение, начало
Аргументы: файл — описатель файла
           смещение, начало — числовые выражения
Результат: числовое значение

Функция sysseek изменяет текущую позицию в заданном файле и возвращает 1 в случае успеха и 0 при неудаче. Она полностью аналогична функции seek, но с одним важным отличием: позиционирование производится без внутренней буферизации данных. Поэтому ее нельзя смешивать с функциями read, print, write, seek, tell, eof и т. п. Использование этой функции допустимо только в сочетании с функциями sysread и syswrite.

Парной функции systell в PERL'e нет. Вместо нее следует использовать sysseek(файл, 0, 1).

Функция syswrite

Синтаксис: syswrite файл, скаляр, длина?, смещение?
Аргументы: файл — описатель файла
           скаляр — имя скалярной переменной
           длина, смещение — числовые выражения
Результат: числовое значение

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

Эта функция выполняет запись без внутренней буферизации данных. Поэтому ее нельзя смешивать с функциями read, print, write, seek, tell, eof и т. п.

Функция tell

Синтаксис: tell файл?
Аргументы: файл — описатель файла
Результат: числовое значение

Функция tell возвращает текущую позицию в заданном файле. Если файл опущен, то возвращается текущая позиция в файле, из которого производилось последнее чтение. Пример:

open OUT, '>test.txt';
print OUT 'abc';
$pos = tell OUT;  # $pos равно 3

Функция truncate

Синтаксис: truncate файл, длина
Аргументы: файл — описатель файла
           длина — числовое выражение
Результат: логическое значение

Функция truncate усекает заданный файл до заданной длины. Она возвращает истину в случае успеха и undef при неудаче.

Windows требует, чтобы файл был открыт для дозаписи в конец файла (т. е. либо функцией open(файл, '>>имя_файла'), либо функцией sysopen(файл, 'имя_файла', O_APPEND | O_RDWR)). Кроме того, для успеха операции требуется, чтобы файл не был открыт другими процессами.

6.11.2. Форматирование вывода

PERL поддерживает два механизма форматирования данных для вывода. Первый механизм заимствован из языка FORTRAN и основан на шаблонах вывода: функция format задает шаблон вывода, а функция write выводит данные в соответствии с заданным шаблоном. Второй механизм заимствован из языка C и реализован функциями printf и sprintf, которые выводят данные в файл в соответствии с заданной спецификацией формата.

Функция Описание
format Декларирует шаблон вывода для write.
formline Форматированный вывод в строку.
printf Форматирует и выводит строку в файл.
sprintf Форматирует строку.
write Форматированный вывод записи в файл.

Функция format

Синтаксис:
format имя =
шаблон
.

Функция format декларирует шаблон вывода с заданным именем. Имена шаблонов образуют собственное пространство имен; иными словами, функция ABC и шаблон ABC не имеют ничего общего. По умолчанию принято, что шаблон вывода для файла с описателем FILE имеет имя FILE. Естественно, что мы можем использовать для форматирования вывода в FILE и шаблоны с другими именами.

Шаблон вывода состоит из строк трех видов:

  • комментарии, которые начинаются с символа # в первой позиции;
  • форматные строки, которые задают формат выводимой строки;
  • строки аргументов, содержащие значения, которые при выводе подставляются в форматные строки.

Форматные строки выводятся в точности так, как они заданы, за исключением специальных полей, в которые подставляются значения, заданные в строках аргументов. Специальные поля начинаются с символа @ или ^. Поля, начинающиеся с символа @, могут иметь следующий вид:

@<…< Выводит значение переменной в поле заданной ширины, выравненное влево.
@>…> Выводит значение переменной в поле заданной ширины, выравненное вправо.
@|…| Выводит значение переменной в поле заданной ширины, выравненное по центру.
@#…# Выводит значение числовой переменной в поле заданной ширины, выравненное вправо.
@#…#. Выводит значение числовой переменной и десятичную точку в поле заданной ширины, выравненное вправо.
@* Выводит многострочное значение без задания ширины поля.

Если выводимая строка не помещается в заданное поле, то она обрезается.

Специальные поля, которые начинаются с символа ^, обрабатываются иначе. Если поле заполнено символом #, то в него также выводится числовое значение, но с одной особенностью: если значение неопределено, то поле выводится пустым. Для остальных заполнителей (<, > и |) соответствующий аргумент должен быть не выражением, а скалярной переменной, содержащей строковое значение. PERL выводит столько символов этой строки, сколько поместится в заданное поле, а затем удаляет эту часть строки из аргумента. Затем поле может повториться на следующей строке и т. д., позволяя вывести длинный текст в несколько строк. Разбивка строки производится только по тем символам, которые заданы в специальной переменной $:. При желании можно добавить в конец последнего поля символы "...", чтобы показать, что строка слишком длинна для полного вывода.

Поля, начинающиеся с символа ^, можно использовать для вывода записей переменной длины. Если исходный текст короток, то мы можем подавить вывод пустых строк, помещая в форматные строки символ ~. Если поместить в строку два символа ~ подряд, то ее вывод будет повторяться до тех пор, пока все поля в строке не будут исчерпаны.

Для вывода заголовка на каждой странице отчета следует использовать функцию format с именем шаблона, состоящим из имени шаблона вывода отчета плюс слово "_TOP".

Пример: следующая программа

format MY_TOP =
	Тестовая страница

.
format MY =
Тест: @<<<<<<<< @||||| @>>>>>
      $str,     $x,    '$'.int($num)
.

$str = 'строка';
$x = '1';
$num = 123.456;
$~ = 'MY';
write;

выведет на консоль такой отчет:


	Тестовая страница

Тест: строка      1      $123

Функция formline

Синтаксис: formline шаблон, список
Аргументы: шаблон — имя шаблона
           список — список выражений
Результат: логическая истина

Это внутренняя функция, используемая функцией write. Она применяет заданный шаблон к заданному списку значений и заносит сформатированный результат в специальную переменную $^A (аккумулятор форматного вывода).

Функция printf

Синтаксис: printf файл? формат, список
Аргументы: файл — описатель файла
           формат — спецификация формата
           список — список выражений

Эта функция эквивалентна выражению print файл sprintf(формат, список) с единственным отличием: в конец выводимой строки не добавляется разделитель выходных записей $\. Пример:

printf STDOUT "Версия PERL: v%vd\n", $^V; # "Версия PERL: v5.6.0"

Функция sprintf

Синтаксис: sprintf формат, список
Аргументы: формат — спецификация формата
           список — список выражений
Результат: строковое значение

Эта функция выполняет форматирование списка в соответствии с правилами, заданными в строке формата, и возвращает полученную таким образом строку. Правила описания форматных строк PERL заимствовал практически без изменений из языка C; тем не менее, для полноты описания мы приводим эти правила здесь.

Форматная строка является комбинацией обычных символов и специальных полей спецификации формата. Поле спецификации формата состоит из символа % и латинской буквы, задающей тип преобразования. Между символом % и буквой типа могут размещаться уточняющие флаги, описанные ниже. Если после символа % стоит буква, неизвестная функции sprintf, то символ % игнорируется, а буква воспринимается как обычный символ; в частности, для вывода в результирующую строку самого символа % можно использовать поле %%. PERL поддерживает следующие типы преобразований:

Поле Аргумент Результат
%c Число Символ с данным кодом.
%s Строка Строка символов.
%d Число Целое десятичное число со знаком.
%u Число Целое десятичное число без знака.
%b Число Целое двоичное число без знака.
%o Число Целое восьмеричное число без знака.
%x Число Целое шестнадцатеричное число без знака.
%X Число То же, но с прописными буквами.
%e Число Плавающее число в научной нотации вида [-]1.2345e±678.
%E Число То же, но с прописным E.
%f Число Плавающее число в формате с десятичной точкой вида [-]1234.5678.
%g Число Плавающее число в наиболее компактном из форматов %e или %f.
%G Число То же, но %E или %f.
%p Переменная Указатель (шестнадцатеричный адрес переменной).
%n Переменная Сохраняет количество символов, выведенных в результирующую строку к этому моменту, в следующей переменной списка аргументов.
%i Число Устаревший синомим для %d.
%D Число Устаревший синомим для %ld.
%U Число Устаревший синомим для %lu.
%O Число Устаревший синомим для %lo.
%F Число Устаревший синомим для %f.

Между символом % и буквой типа могут указываться следующие флаги:

Флаг Значение
пробел Начинать положительные числа с символа пробел.
+ Начинать положительные числа с символа +.
- Выравнивание результата по левому краю.
0 Использовать нули, а не пробелы, для выравнивания по правому краю.
# Начинать ненулевые восьмеричные числа с "0", ненулевые шестнадцатеричные числа с "0x".
число Минимальная ширина поля.
.число Для плавающих чисел — число знаков после запятой, для строк — максимальная длина, для целых чисел — минимальная длина.
l Интрепретировать число как переменную типа long или unsigned long языка C.
h Интрепретировать число как переменную типа short или unsigned short языка C.
h Интрепретировать число как переменную типа short или unsigned short языка C.
V Интрепретировать число как переменную стандартного целого типа языка PERL.
v Интрепретировать строку как вектор кодов символов, при выводе разделять точками.
*v Интрепретировать строку как вектор кодов символов, при выводе разделять следующим аргументом из списка.

Вместо числа в качестве флага может быть задан символ *. В этом случае значение этого числа извлекается из очередного элемента списка аргументов. Если полученная таким образом ширина поля отрицательна, то поле выравнивается по левому краю.

Примеры форматирования строк:

%s = sprintf "%#0.8x\n", 256;           # %s = "0x00000100"
%s = sprintf "%+10E\n", 256;            # %s = "+2.560000E+002"
%s = sprintf "Версия PERL: %vd\n", $^V; # %s = "Версия PERL: 5.6.0"

Функция write

Синтаксис: write файл?
Аргументы: файл — описатель файла

Эта функция выводит форматированную запись в указанный файл, используя шаблон, ассоциированный с данным файлом. По умолчанию этот шаблон имеет то же имя, что и описатель файла, но шаблон, ассоциированный с файлом, принятым для вывода по умолчанию, может иметь любое имя; для связи его с файлом достаточно занести имя шаблона в переменную $~. Пример вызова этой функции см. в описании функции format.

6.11.3. Функции управления файлами

Функция Описание
-attr Возвращает заданный атрибут файла.
chmod Изменяет атрибуты файлов.
glob Возвращает список имен файлов, соответствующих образцу.
link Связывает новый файл с существующим.
lstat Возвращает информацию о символической ссылке.
rename Переименовывает файл.
stat Возвращает информацию о файле.
unlink Удаляет заданные файлы.
utime Изменяет время последнего доступа и модификации файлов.

Функция -attr

Синтаксис: -attr файл
Аргументы: attr — буква, задающая атрибут файла
           файл — описатель файла
Результат: логическое значение

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

Атрибут Значение
-r Файл доступен для чтения пользователю с данным эффективным UID.
-w Файл доступен для записи пользователю с данным эффективным UID.
-x Файл доступен для исполнения пользователю с данным эффективным UID.
-o Файл принадлежит пользователю с данным эффективным UID.
-R Файл доступен для чтения пользователю с данным реальным UID.
-W Файл доступен для записи пользователю с данным реальным UID.
-X Файл доступен для исполнения пользователю с данным реальным UID.
-O Файл принадлежит пользователю с данным реальным UID.
-e Файл существует.
-z Файл имеет нулевой размер.
-s Файл имеет ненулевой размер (возвращается размер файла).
-f Это обычный файл.
-d Это каталог.
-l Это символическая ссылка.
-p Это канал ввода-вывода (pipe).
-S Это сокет.
-b Это специальный блочный файл.
-c Это специальный посимвольный файл.
-t Это терминал (tty).
-u У файла установлен бит setuid.
-g У файла установлен бит setgid.
-k У файла установлен бит sticky.
-T Это текстовый файл.
-B Это двоичный файл.
-M Возраст файла в днях на момент запуска сценария.
-A Возраст последнего доступа к файлу в днях на момент запуска сценария.
-C Возраст последнего обновления файла в днях на момент запуска сценария.

Пример:

print "Файл доступен для чтения\n" if -r FILE;

Функция chmod

Синтаксис: chmod маска, список
Аргументы: маска — числовое выражение
           список — список имен файлов
Результат: числовое значение

Функция chmod изменяет маску прав доступа к файлам, указанным в списке, на заданную, и возвращает количество файлов, у которых это изменение прошло успешно. Маска задается числом или символической константой из модуля Fcntl (нужна директива use Fcntl ':mode'). По традиции Unix элементы маски задаются восьмеричными числами, поэтому в следующей таблице значения символических констант приведены в восьмеричном виде:

Символическое имя Число Операция
_S_IXOTH 00001 Разрешается выполнение (для файлов) и поиск (для каталогов) прочим пользователям.
_S_IWOTH 00002 Разрешается запись прочим пользователям.
_S_IROTH 00004 Разрешается чтение прочим пользователям.
_S_IXGRP 00010 Разрешается выполнение (для файлов) и поиск (для каталогов) членам группы.
_S_IWGRP 00020 Разрешается запись членам группы.
_S_IRGRP 00040 Разрешается чтение членам группы.
_S_IEXEC 00100 Разрешается выполнение (для файлов) и поиск (для каталогов) владельцу.
_S_IWRITE 00200 Разрешается запись владельцу.
_S_IREAD 00400 Разрешается чтение владельцу.
_S_ISVTX 01000 Бит принадлежности.
_S_ISGID 02000 Установить группе права на выполнение.
_S_ISUID 04000 Установить пользователю права на выполнение.

В Windows поддерживаются только флаги _S_IEXEC, _S_IWRITE и _S_IREAD. Пример:

use Fcntl ':mode';
chmod _S_IREAD | _S_WRITE, 'myfile.txt';

Функция glob

Синтаксис: glob образец?
Аргументы: образец — строковое выражение
Результат: список строк

Функция glob возвращает список имен файлов, соответствующих заданному образцу. Если образец опущен, то используется содержимое специальной переменной $_. Строка считается образцом, если она содержит хотя бы один из специальных символов "?", "*" или "[". Раскрытие образца — это операция, преобразующая образец в список соответствующих ему полных имен файлов. Правила соответствия определены следующим образом:

  • "?" (не в квадратных скобках) соответствует любому одиночному символу.
  • "*" (не в квадратных скобках) соответствует любой строке, включая пустую строку.

Квадратные скобки используются для задания групп символов так же, как в регулярных выражениях PERL. Можно задавать группы одиночных символов ("[abc]"), диапазоны символов ("[a-z0-9]") и все символы, кроме указанных ("[!abc]"). Для включения в образец специального символа как обычного перед ним ставится обратная косая черта "\". Примеры:

@list = glob '*.c';         # возвращает имена всех файлов, оканчивающихся на ".c"
@list = glob '*';           # возвращает имена всех файлов
                              (кроме тех, что начинаются с точки!)
@list = glob 'dir/%[0-9]*'; # возвращает имена всех файлов в каталоге dir, у которых
                              второй символ имени — цифра

В DOS и Windows использование этой функции с именами каталогов затруднительно, поскольку там имена каталогов разделяются не косой чертой "/", а обратной косой чертой "\", которая в glob имеет специальное назначение. Поэтому для этих систем существует специальный модуль File::DosGlob, который входит в стандартный дистрибутив PERL.

Функция link

Синтаксис: link старое имя, новое имя
Аргументы: старое имя, новое имя — строковые выражения
Результат: логическое значение

Функция link создает файл с новым именем и связывает его с существующим файлом, имеющим старое имя. Возвращает ненулевое значение при удачном завершении и нуль при неудаче. В Windows реализована только для файловой системы NTFS (Windows NT/2000).

Функция lstat

Синтаксис: lstat файл?
Аргументы: файл — описатель файла или имя файла
Результат: список значений

Функция lstat возвращает ту же информацию о файле, что и функция stat, но эта информация возвращается о символической ссылке, а не о файле, на который эта ссылка указывает. Если операционная система не поддерживает символические файловые ссылки, то эта функция эквивалентна stat. Если файл опущен, то используется содержимое специальной переменной $_.

Функция rename

Синтаксис: rename старое имя, новое имя
Аргументы: старое имя, новое имя — строковые выражения
Результат: логическое значение

Функция link переименовыает файл со старым именем, присваивая ему новое имя. Возвращает ненулевое значение при удачном завершении и нуль при неудаче. Пример:

rename 'myfile.txt', 'mynewfile.txt';

Функция stat

Синтаксис: stat файл?
Аргументы: файл — описатель файла или имя файла
Результат: список значений

Функция stat возвращает массив информации о заданном файле. Если файл опущен, то используется содержимое специальной переменной $_. При неудаче возвращается нулевое значение. Информационный массив имеет следующее строение:

Индекс Содержимое
0 Номер устройства в файловой системе.
1 Номер узла (inode).
2 Режим файла (тип и маска прав доступа).
3 Число жестких ссылок на файл.
4 UID владельца файла.
5 GID владельца файла.
6 Идентификатор устройства (для специальных файлов).
7 Размер файла в байтах.
8 Время последнего доступа к файлу.
9 Время последнего изменения файла.
10 Время изменения узла (inode).
11 Размер блока файловой системы.
12 Количество блоков, выделенных файлу.

Все времена в этом массиве хранятся как количество секунд с начала эпохи, за которую принято 00:00 по Гринвичу 1 января 1970 г. В Windows поля 0, 1 и 10 лишены смысла. Типичный пример:

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime,
 $blksize, $blocks) = stat('myfile.txt');

Если параметром файл является символ _, то возвращается массив данных от последнего вызова stat. В скалярном контексте возвращается логическое значение, означающее успех или неудачу, и в случае удачи заполняется внутренний массив, который может быть считан вызовом stat(_).

Функция unlink

Синтаксис: unlink список?
Аргументы: список — список строковых выражений
Результат: логическое значение

Функция unlink удаляет файлы, имена которых перечислены в списке. Если список опущен, то используется содержимое специальной переменной $_. Возвращается количество успешно удаленных файлов. Примеры:

$count = unlink 'a.txt', 'b.txt', 'c.txt';
unlink @list;
unlink <*.bak>;

Для удаления каталогов следует пользоваться функцией rmdir.

Функция utime

Синтаксис: utime список?
Аргументы: список — список строковых выражений
Результат: логическое значение

Функция utime изменяет время последнего доступа и последнего изменения у файлов, имена которых перечислены в списке. Новые значения этих времен должны быть первыми двумя элементами списка. Если список опущен, то используется содержимое специальной переменной $_. Возвращается количество успешно измененных файлов. Пример:

$now = time;
utime $now, $now, 'myfile.txt';

В Windows 95/98 с файловой системой FAT время последнего доступа к файлу не поддерживается, поэтому данная функция изменяет только время последнего изменения заданных файлов.

6.11.4. Функции управления каталогами

Функция Описание
chdir Изменяет текущий каталог.
closedir Закрывает каталог.
mkdir Создает новый каталог.
opendir Открывает заданный каталог.
readdir Считывает очередной элемент каталога.
rewinddir Возвращается к началу каталога.
rmdir Удаляет заданный каталог.
seekdir Изменяет текущую позицию в каталоге.
telldir Возвращает текущую позицию в каталоге.

Функция chdir

Синтаксис: chdir имя?
Аргументы: имя — строковое выражение
Результат: логическое значение

Функция chdir изменяет текущий рабочий каталог на каталог с заданным именем. Если имя опущено, то используется каталог, заданный в переменной среды $ENV{HOME}; если такой переменной нет, то используется каталог, заданный в переменной среды $ENV{LOGDIR}; если и ее нет, то не делается ничего. Возвращается истина при успешной смене текущего каталога и ложь при неудаче. Пример:

chdir "c:\\windows\\temp" or die "Не могу сменить каталог: $!\n";

Функция closedir

Синтаксис: closedir каталог
Аргументы: каталог — описатель каталога
Результат: логическое значение

Функция closedir закрывает каталог, ранее открытый функцией opendir. Возвращается истина при успешном закрытии каталога и ложь при неудаче. Пример см. в описании opendir.

Функция mkdir

Синтаксис: mkdir имя, маска?
Аргументы: имя — строковое выражение
           маска — числовое выражение
Результат: логическое значение

Функция mkdir создает новый каталог с заданным именем и заданной маской прав доступа. Права доступа задаются так же, как в функции umask; если маска опущена, то ее значение принимается равным 0777. Возвращается истина при успешной смене текущего каталога и ложь при неудаче. Пример:

mkdir "c:\\mydir" or die "Не могу создать каталог: $!\n";

Функция opendir

Синтаксис: opendir каталог, имя
Аргументы: каталог — описатель каталога
           имя — строковое выражение
Результат: логическое значение

Функция opendir открывает каталог с заданным именем и заносит его описатель в переменную каталог. Возвращается истина при успешном открытии каталога и ложь при неудаче. Описатели открытых каталогов используются функциями readdir, telldir, seekdir, rewinddir и closedir. Следует помнить, что описатели каталогов имеют собственное пространство имен, не совпадающее с пространством имен описателей файлов.

Приведем пример, который выводит на экран имена всех файлов в текущем каталоге Windows с расширением '.pl':

opendir(DIR, '.');
@files = grep {!(/^\./) && /\.pl$/} readdir(DIR);
closedir(DIR);
print "$_\n" foreach @files;

Функция readdir

Синтаксис: readdir каталог
Аргументы: каталог — описатель каталога
Результат: строка или список строк

Функция readdir считывает очередной элемент каталога, открытого функцией opendir и возвращает его. В списочном контексте возвращается список всех элементов каталога с текущего элемента и до конца. Если каталог просмотрен до конца, то возвращается undef в скалярном контексте и нулевой список в списочном контексте. Пример см. в описании opendir.

Функция rewinddir

Синтаксис: rewinddir каталог
Аргументы: каталог — описатель каталога

Функция rewinddir "перематывает" заданный каталог в начало. Она используется совместно с функцией readdir для многократного просмотра элементов каталога.

Функция rmdir

Синтаксис: rmdir имя?
Аргументы: имя — строковое выражение
Результат: логическое значение

Функция rmdir удаляет каталог с заданный именем. Если аргумент опущен, то используется содержимое специальной переменной $_. Удаление каталога возможно только тогда, когда в нем нет файлов. Возвращается истина при успешном удалении каталога и ложь при неудаче. Пример:

rmdir "c:\\mydir" or die "Не могу удалить каталог: $!\n";

Функция seekdir

Синтаксис: seekdir каталог, позиция
Аргументы: каталог — описатель каталога
           позиция — числовое выражение

Функция seekdir устанавливает текущую позицию в заданном каталоге равной заданной позиции. Позиция должна быть значением, ранее полученным вызовом функции telldir.

Функция telldir

Синтаксис: telldir каталог
Аргументы: каталог — описатель каталога
Результат: числовое значение

Функция telldir возвращает текущую позицию в заданном каталоге. Это значение может быть в дальнейшем использовано для вызова функции seekdir.