Ответ 1
Вам нужно установить автозапуск для STDOUT. Пример:
use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
print '.';
sleep(1);
}
У меня есть вычислительно дорогостоящая задача в perl и хочу сообщить пользователю, что вычисление продолжается, распечатывая период после завершения каждой части вычисления. К сожалению, пока я не напечатаю "\n", ни один из моих периодов не печатается. Как я могу обратиться к этому вопросу?
Вам нужно установить автозапуск для STDOUT. Пример:
use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
print '.';
sleep(1);
}
установите $|=1
перед началом печати. Например.
perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
Отличная статья, которую вы должны прочитать: Страдает от буферизации?
См. часто задаваемые вопросы Как сбросить/удалить буфером дескриптор выходного файла? Зачем мне это делать? и обратите внимание:
Помимо специальной переменной
$|
вы можете использоватьbinmode
, чтобы дать вашему файловому дескриптору слой:unix
, который небуферирован...
Для общей проблемы вы можете посмотреть Time::Progress:
%b
%b
индикатор выполнения, который выглядит следующим образом:
##############......................
Что сработало для меня, это поставить строку
STDOUT->autoflush(1);
перед моей линией
print ".";
внутри существующего цикла. Не использовал сон из-за боязни замедления вещей даже больше.