Как печатать до запуска цикла в Perl? - PullRequest
0 голосов
/ 30 июня 2018

У меня есть этот код в Perl:

print "Processing ... ";
while ( some condition ) {
    # do something over than 10 minutes
}
print "OK\n";

Теперь я возвращаю первый отпечаток после , пока цикл завершен.

Как я могу напечатать сообщение до пока цикл не запущен?

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Обычно perl буферизует до 8 КБ выходного текста перед его сбросом на устройство или до следующей новой строки, если устройство является терминалом. Вы можете избежать этого, добавив

STDOUT->autoflush

в начало вашего кода, при условии, что вы печатаете до STDOUT. Это приведет к сбросу данных после каждой операции print, say или write

Обратите внимание, что это то же самое, что и $| = 1, но значительно менее загадочно и позволяет изменять свойства любого данного дескриптора файла

0 голосов
/ 01 июля 2018

Вы можете увидеть распечатки, сразу же после очистки буферов.

print "Processing ... ";
STDOUT->flush;

Если вы используете autoflush, вы должны сохранить текущую конфигурацию, дублируя дескриптор файла.

use autodie; # dies if error on open and close.

{
    STDOUT->flush; # empty its buffer
    open my $saved_stdout, '>&', \*STDOUT;
    STDOUT->autoflush;

    # ... output with autoflush active

    open STDOUT, '>&', $saved_stdout; # restore old STDOUT
}

См. perldoc -f open и найдите /\>\&/

0 голосов
/ 30 июня 2018

Вывод буферизован, это означает, что программа решает, когда она на самом деле отрисовывает то, что вы print редактировали. Вы можете поставить

$| = 1;

для сброса stdout в этом единственном экземпляре. Для получения дополнительных методов (автоматическая очистка, очистка файлов и т. Д.) Вы можете найти в SO вопросы по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...