Изменение файлового дескриптора вывода по умолчанию

По умолчанию, если при вызове print (или printf – все, что мы здесь говорим об одной функции, в равной степени относится к другой) не указан файловый дескриптор, данные направляются в STDOUT. Однако этот файловый дескриптор по умолчанию можно сменить оператором select. В следующем фрагменте несколько выходных строк отправляются в BEDROCK:

select BEDROCK;
print "I hope Mr. Slate doesn't find out about this.\n";
print "Wilma!\n";

Файловый дескриптор, выбранный по умолчанию для вывода, остается выбранным на будущее. Чтобы не создавать путаницу в программе, обычно рекомендуется возвращать STDOUT на место сразу же после завершения.1 По умолчанию вывод в каждый файловый дескриптор буферизуется. Если задать специальной переменной $| значение 1, текущий файловый дескриптор (то есть выбранный на момент изменения переменной) всегда сбрасывает буфер после каждой операции вывода. Таким образом, если вы хотите быть уверены в том, что все записи сохраняются в журнале одновременно (например, если вы читаете данные из журнала, отслеживая ход продолжительного выполнения программы), используйте конструкцию следующего вида:

select LOG;
$| = 1; # Не оставлять данные LOG в буфере
select STDOUT;
# ... Проходят годы, сдвигаются тектонические плиты, а потом...
print LOG "This gets written to the LOG at once!\n";

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

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

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