Perl Drucken Pufferung bündig
Frage
Ich habe folgenden Perl-Code:
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. Jede Idee, warum?
EDIT: Ich habe den Grund gefunden und haben es in der Antwort hinzugefügt. Die Lösung war:
Ich habe die folgende Zeile in der Schleife und es hat funktioniert:
select STDOUT;
Ich denke, der Code in process () Funktion haben sollte den Standard Modifizieren Ausgangspuffer. Es wurde ein Code geschrieben von jemand anderem!
Ich bin nicht sicher, ob dies ein Problem mit Perl, die erlaubt dies oder das Entwickler, der hat es nicht wieder ändern auf den Standard.
Der letzte Code sah wie folgt aus:
foreach(...) { ... foreach(...) { select STDOUT; print("Processing $folder"); $|=1; process($folder); } ... }
Dank all ...
Lösung
Good Detektivarbeit in dieses Problem aufzuspüren!
Ich möchte eine alternative Lösung vorzuschlagen.
Anstatt select()
Kriege mit dem Autor von process()
mit, können Sie die IO verwenden könnte :: Handle Schnittstelle zu STDOUT:
use IO::Handle;
foreach(...)
{
...
foreach(...)
{
STDOUT->printflush("Processing $folder");
process($folder);
}
...
}
Andere Tipps
Ich habe die folgende Zeile in der Schleife und es hat funktioniert:
select STDOUT;
ich glaube, den Code in process () Funktion sollte die Standard-Ausgabepuffer wurden zu modifizieren. Es wurde von jemand anderem ein Code geschrieben!
Ich bin nicht sicher, ob dies ein Problem mit Perl ist die in dieser oder den Entwickler erlaubt, die es nicht auf die Standardeinstellung ändern zurück.
Der letzte Code sah wie folgt aus:
foreach(...)
{
...
foreach(...)
{
select STDOUT;
print("Processing $folder");
$|=1;
process($folder);
}
...
}
Dank all ...
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";
}