Perl Print буферизованный флеш
Вопрос
У меня есть следующий код Perl:
STDOUT->autoflush(1);
foreach(...)
{
...
foreach(...)
{
print("Processing $folder");
$|=1;
process($folder);
}
...
}
, но оператор print работает только на первой итерации цикла и ничего не печатает после этого. Есть идеи почему?
РЕДАКТИРОВАТЬ: Я нашел причину и добавил ее также в ответ. Решение было:
Я добавил следующую строку внутри цикл, и это сработало:
выберите STDOUT;
Я думаю, что код в функции process () должен был изменить по умолчанию выходной буфер. Это был код написанный кем-то другим!
Я не уверен, что это проблема с Perl, который позволяет это или разработчик, который не изменил его обратно по умолчанию.
Окончательный код выглядел так:
foreach(...) { ... foreach(...) { select STDOUT; print("Processing $folder"); $|=1; process($folder); } ... }
Спасибо всем ...
Решение
Хорошая детективная работа по выявлению этой проблемы! Р>
Я хотел бы предложить альтернативное решение.
Вместо того чтобы воевать select ()
с автором process ()
, вы можете использовать IO :: Handle интерфейс для STDOUT:
use IO::Handle;
foreach(...)
{
...
foreach(...)
{
STDOUT->printflush("Processing $folder");
process($folder);
}
...
}
Другие советы
Я добавил следующую строку в цикл, и это сработало:
select STDOUT;
Я думаю, что функция code in process () должна была изменять выходной буфер по умолчанию. Это был код, написанный кем-то другим!
Я не уверен, что это проблема с Perl, которая позволяет это или разработчику, который не изменил его обратно на значение по умолчанию.
Окончательный код выглядел так:
foreach(...)
{
...
foreach(...)
{
select STDOUT;
print("Processing $folder");
$|=1;
process($folder);
}
...
}
Спасибо всем ...
Мой код выглядит следующим образом:
#!/usr/bin/perl -w
use strict;
use warnings;
use sigtrap qw/handler signal_handler normal-signals/;
use feature qw(say);
my $datetime;
$datetime = localtime ();
say "tester started $datetime";
while ( 1 ) {
select STDOUT;
$datetime = localtime ();
say "tester output every second $datetime";
$|=1;
sleep ( 1 );
}
sub signal_handler {
die "\nCaught a signal $!\n";
}