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