2009-08-03 6 views
3

J'ai le code Perl suivant:Perl tampon d'impression flush

STDOUT->autoflush(1); 

foreach(...) 
{ 
    ... 

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

mais l'instruction d'impression ne fonctionne que dans la première itération de la boucle et n'imprime rien après. Une idée pourquoi?

EDIT: J'ai trouvé la raison et je l'ai ajouté dans la réponse. La solution était:

I a ajouté la ligne suivante dans la boucle et cela a fonctionné:

select STDOUT;

Je pense que le code dans la fonction process() aurait dû modifier le tampon de sortie par défaut. C'était un code écrit par quelqu'un d'autre!

Je ne sais pas si cela est un problème avec Perl qui permet ceci ou le développeur qui n'a pas changé en arrière par défaut.

Le code final ressemblait à ceci:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

Merci à tous ...

+0

Etes-vous sûr qu'il ya plus qu'une itération? – innaM

+0

ouais il y a plus d'une itération. J'ai essayé d'ajouter une déclaration d'avertissement et elle était imprimée plusieurs fois. – Manoj

+0

a trouvé le problème. S'il vous plaît voir ma réponse ci-dessous. – Manoj

Répondre

10

Un bon travail de détective pour traquer ce problème!

Je voudrais suggérer une autre solution.

Plutôt que d'avoir select() guerres avec l'auteur de process(), vous pouvez utiliser l'interface IO::Handle à STDOUT:

use IO::Handle; 

foreach(...) 
{ 
    ... 

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

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

I a ajouté la ligne suivante dans la boucle et il a travaillé:

select STDOUT; 

Je pense la fonction code in process() aurait dû modifier le tampon de sortie par défaut. C'était un code écrit par quelqu'un d'autre!

Je ne sais pas si c'est un problème avec Perl qui permet à celui-ci ou au développeur qui ne l'a pas modifié par défaut.

Le code final ressemblait à ceci:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

Merci à tous ...

0

Mon code ressemble à ceci:

#!/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"; 
}