Как распечатать текст сразу, не дожидаясь перехода на новую строку в Perl?

У меня есть вычислительно дорогостоящая задача в perl и хочу сообщить пользователю, что вычисление продолжается, распечатывая период после завершения каждой части вычисления. К сожалению, пока я не напечатаю "\n", ни один из моих периодов не печатается. Как я могу обратиться к этому вопросу?

Ответы

Ответ 1

Вам нужно установить автозапуск для STDOUT. Пример:

use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
  print '.';
  sleep(1);
}

Ответ 2

установите $|=1 перед началом печати. Например.

perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'

Ответ 4

См. часто задаваемые вопросы Как сбросить/удалить буфером дескриптор выходного файла? Зачем мне это делать? и обратите внимание:

Помимо специальной переменной $| вы можете использовать binmode, чтобы дать вашему файловому дескриптору слой :unix, который небуферирован...

Для общей проблемы вы можете посмотреть Time::Progress:

%b

%b

индикатор выполнения, который выглядит следующим образом:

##############......................

Ответ 5

Что сработало для меня, это поставить строку

STDOUT->autoflush(1);

перед моей линией

print ".";

внутри существующего цикла. Не использовал сон из-за боязни замедления вещей даже больше.