Если вы прочитаете статью Марка Джейсона Доминуса, Страдая от буферизации , вы увидите, что настройка $|
применяется к текущему дескриптору файла.Если вы установите $| = 1;
в верхней части вашего скрипта, вы, вероятно, отключите буферизацию для STDOUT.Тем не менее, ваш скрипт пишет в файловый дескриптор с именем $output
.
Вы должны поместить эту строку в свой скрипт сразу после вызова open
.
select( ( select( $output ), $|=1 )[0] ); # borrowed from the Suffering from Buffering article.
Этот трюк выбирает дескриптор файла $output
, отключает буферизацию, а затем повторно выбирает первоначально выбранный дескриптор файла(предположительно STDOUT), чтобы остальная часть вашего сценария не начинала использовать $ output по незнанию.
Это также задокументировано в perlfaq5 , который входит в стандартную комплектацию при каждой полной установке Perl.
В качестве наилучшей практики вам, вероятно, следует либо ставить or die $!
после всех вызовов ввода-вывода, либо use autodie;
в верхней части сценария.Я говорю «вероятно», потому что всегда есть исключения, но вряд ли это одно из них.