Как я могу напечатать текст сразу, не дожидаясь новой строки в Perl? - PullRequest
14 голосов
/ 12 марта 2010

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

Ответы [ 5 ]

17 голосов
/ 12 марта 2010

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

use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
  print '.';
  sleep(1);
}
7 голосов
/ 12 марта 2010

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

perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
4 голосов
/ 12 марта 2010

Отличная статья, которую вы должны прочитать: Страдание от буферизации?

2 голосов
/ 12 марта 2010

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

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

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

%b

%B

индикатор выполнения, который выглядит как:

##############......................
0 голосов
/ 27 октября 2010

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

STDOUT->autoflush(1);

перед моей строкой

print ".";

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

...