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 ...

War es hilfreich?

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";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top