Perl Print буферизованный флеш - PullRequest
       18

Perl Print буферизованный флеш

5 голосов
/ 03 августа 2009

У меня есть следующий код Perl:

STDOUT->autoflush(1);

foreach(...)
{
    ...

    foreach(...)
    {
        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}

но оператор print работает только на первой итерации цикла и ничего не печатает после этого. Есть идеи почему?

РЕДАКТИРОВАТЬ: Я нашел причину и добавил ее также в ответ. Решение было:

Я добавил следующую строку внутри цикл и это сработало:

выберите STDOUT;

Я думаю, что код в функции process () должен был изменить по умолчанию выходной буфер. Это был код написанный кем-то другим!

Я не уверен, если это проблема с Perl, который позволяет это или разработчик, который не изменил его обратно по умолчанию.

Окончательный код выглядел так:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}

Спасибо всем ...

Ответы [ 3 ]

11 голосов
/ 04 августа 2009

Хорошая детективная работа по выявлению этой проблемы!

Я бы хотел предложить альтернативное решение.

Вместо select() войн с автором process() вы можете использовать интерфейс IO :: Handle для STDOUT:

use IO::Handle;

foreach(...)
{
    ...

    foreach(...)
    {
        STDOUT->printflush("Processing $folder");

        process($folder);
    }
    ...
}
5 голосов
/ 03 августа 2009

Я добавил следующую строку внутри цикла, и она заработала:

select STDOUT;

Я думаю, что функция code in process () должна была изменять выходной буфер по умолчанию. Это был код, написанный кем-то другим!

Я не уверен, если это проблема с Perl, который позволяет это или разработчику, который не изменил его обратно на значение по умолчанию.

Итоговый код выглядел так:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}

Спасибо всем ...

0 голосов
/ 10 июня 2016

Мой код выглядит так:

#!/usr/bin/perl -w

use strict;
use warnings;
use sigtrap qw/handler signal_handler normal-signals/;
use feature qw(say);

my $datetime;
$datetime = localtime ();

say "tester started $datetime";

while ( 1 ) {
    select STDOUT;
    $datetime = localtime ();
    say "tester output every second $datetime";
    $|=1;
    sleep ( 1 );
}

sub signal_handler {
    die "\nCaught a signal $!\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...