Открытие файлового дескриптора

Итак, Perl предоставляет три стандартных дескриптора STDIN, STDOUT и STDERR, автоматически открытых для файлов и устройств, заданных родительским процессом (вероятно, командным процессором). Если вам понадобятся другие файловые дескрипторы, воспользуйтесь оператором open. Этот оператор выдает запрос к операционной системе на открытие канала ввода/вывода между вашей программой и внешним миром. Несколько примеров:

open CONFIG, "dino";
open CONFIG, " open BEDROCK, ">fred";
open LOG, ">>logfile";

Первая команда открывает файловый дескриптор с именем CONFIG для файла dino. Иначе говоря, (существующий) файл dino открывается, а все хранящиеся в нем данные становятся доступными для программы через файловый дескриптор CONFIG. Происходящее напоминает обращение к данным файла через STDIN при включении в командную строку конструкций перенаправления командного процессора вроде файл открывается для вывода.


Файловый манипулятор BEDROCK открывается для вывода в новый файл с именем fred. По аналогии с тем, как знак > используется для перенаправления вывода в командном процессоре, выходные данные направляются в новый файл с именем fred. Если файл с таким именем уже существует, он стирается и заменяется новым.

Четвертый пример показывает, как использовать два знака > (тоже по аналогии с командным процессором) при открытии файла в режиме присоединения. А именно, если файл уже существует, новые данные будут дописываться в конец. Если же файл не существует, он создается по аналогии с режимом >. Например, режим присоединения удобен при работе с журнальными файлами; программа записывает несколько строк в конец журнала при каждом запуске. Собственно, поэтому в четвертом примере файловый дескриптор назван LOG («журнал»), а файл – logfile.

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

my $selected_output = "my_output";
open LOG, "> $selected_output";

Обратите внимание на пробел после знака >. Perl игнорирует его, но пробел предотвращает неприятные сюрпризы – например, если $selected_output будет содержать строку ">passwd" (что приведет к открытию файла в режиме присоединения, а не в режиме записи).


В современных версиях Perl (начиная с Perl 5.6) стал возможен вызов open с тремя аргументами:

open CONFIG, "<", "dino";
open BEDROCK, ">", $file_name;
open LOG, ">>", &logfile_name();

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы вызова
Ввод данных оператором <>
Вывод функцией say
Закрытие файлового дескриптора
Запись данных в стандартный вывод

Вернуться в раздел: Perl / 4. Ввод и вывод