2009-08-03 2 views
3

У меня есть следующий код: PerlPerl печати буферизация флеш

STDOUT->autoflush(1); 

foreach(...) 
{ 
    ... 

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

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

EDIT: Я нашел причину и добавил ее в ответ. Решение было:

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

выберите STDOUT;

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

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

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

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

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

+0

Вы уверены, что есть больше чем одна итерация? – innaM

+0

Да, есть более чем одна итерация. Я попытался добавить предупреждение, и он печатался несколько раз. – Manoj

+0

нашел проблему. См. Мой ответ ниже. – Manoj

ответ

10

Хорошая работа детектива выследить эту проблему!

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

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

use IO::Handle; 

foreach(...) 
{ 
    ... 

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

     process($folder); 
    } 
    ... 
} 
4

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

select STDOUT; 

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

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

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

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

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

0

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

#!/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"; 
} 
Смежные вопросы