2009-08-03 10 views
3

Ich habe folgende Perl-Code:Perl drucken Pufferung bündig

STDOUT->autoflush(1); 

foreach(...) 
{ 
    ... 

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

aber die print-Anweisung funktioniert nur in der ersten Iteration der Schleife und druckt nicht alles danach. Irgendeine Idee warum?

EDIT: Ich habe den Grund gefunden und habe es in der Antwort auch hinzugefügt. Die Lösung war:

I addierten folgende Zeile innerhalb der Schleife und es funktionierte:

select STDOUT;

Ich denke, der Code in Prozess() -Funktion sollte den Standard Ausgabepuffer geändert haben. Es war ein Code geschrieben von jemand anderem!

Ich bin nicht sicher, ob dies ein Problem mit Perl ist die in dieser oder die Entwickler erlaubt, die es nicht zurück auf die Standardeinstellung ändern.

Der endgültige Code sah wie folgt aus:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

Dank all ...

+0

Bist Du sicher, dass es mehr ist als eine Iteration? – innaM

+0

Ja, es gibt mehr als eine Iteration. Ich habe versucht, warnen Aussage hinzufügen und es wurde mehrmals gedruckt. – Manoj

+0

das Problem gefunden. Bitte sehen Sie meine Antwort unten. – Manoj

Antwort

10

gute Detektivarbeit in dieses Problem aufzuspüren!

Ich möchte eine alternative Lösung vorschlagen.

Eher select() Kriege mit dem Autor von process(), als wenn, könnten Sie die IO::Handle Schnittstelle zu STDOUT verwenden:

use IO::Handle; 

foreach(...) 
{ 
    ... 

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

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

ich die folgende Zeile in der Schleife hinzugefügt und es funktionierte:

select STDOUT; 

Ich denke, Die Funktion code in process() sollte den Standard-Ausgabepuffer geändert haben. Es war ein Code, der von jemand anderem geschrieben wurde!

Ich bin mir nicht sicher, ob dies ein Problem mit Perl ist, das es diesem oder dem Entwickler ermöglicht, es nicht auf den Standard zurückzusetzen.

Der endgültige Code sah wie folgt aus:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

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

Dank all ...

0

Mein Code sieht wie folgt aus:

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