2016-05-11 7 views
0

Ich habe Perl-Skript, das ich in Windows ausgeführt werde. In dem Skript rufe ich einen anderen Perl-Scrip auf. Ich versuche, beide Skripte zum Drucken in das Cmd-Fenster und eine Datei zu bekommen. Dieser im Grunde, wie ich den AnrufDrucken von Nachrichten auf dem Bildschirm und eine Datei

using IO::Tee 
    open (my $file, '>>', "C:\\Logs\\logfile.txt") or die "couldn't open log file: $!"; 
    me $tee = IO::Tee->new(\*STDOUT, $file); 
    # doing some stuff 
    print $tee "log about what i just did"; 
    # do more stuff 
    print $tee "more logs"; 
    print $tee `c:\\secondScript.pl arg1`; 
    print $tee "done with script"; 

Das zweite Skript tue, ist im Grunde

# do stuff 
    print "script 2 log about stuff"; 
    # do more stuff 
    print "script 2 log about more stuff"; 
    print "script 2 done"; 

Dies alles auf den Bildschirm und eine Datei. Ich sehe jedoch nicht, dass "script 2 über stuff", "script 2 log über mehr stuff" und "script 2 done" erst nach Skript 2 beendet wird. Ich würde gerne den gesamten Stream auf dem Bildschirm und der Datei sehen, sobald der Druck erreicht ist.

+4

Versuchen Sie, die Ausgabepufferung im zweiten Skript zu deaktivieren. '$ | = 1'; –

Antwort

2

Drucken auf stdout normalerweise Linie gepufferte (Dinge zu beschleunigen), wenn der Ausgang geht zu einem Terminal und Block gepuffert sonst (z.B. wenn der Ausgang in einer Datei Umleiten).
Sie können sich das so vorstellen, als ob alles Gedruckte zuerst in einen Puffer (normalerweise 4096 Bytes groß) und nur dann, wenn der Puffer voll ist (d. H. 4096 Zeichen wurden gedruckt), auf den Bildschirm ausgegeben wird.

Zeile gepuffert bedeutet, dass die Ausgabe nur auf dem Bildschirm angezeigt wird, nachdem eine \n gefunden wurde (oder der Puffer ist erschöpft). Sie haben \n s in Ihrem 2. Skript, so dass keine Ausgabe angezeigt wird, bis entweder a) \n kommt, b) Puffer ist voll, oder c) das Skript endet.

Block gepuffert bedeutet, dass der Ausgang nur angezeigt wird, wenn der Puffer voll ist. \n s beeinflussen dies hier nicht (außer zum Zählen als ein Zeichen).

Um die Pufferung zu vermeiden gibt es eine magische Variable namens $|. Vom docs (navigieren Sie zu dem $| Abschnitt nach unten):

Wenn auf ungleich Null gesetzt, zwingt ein Flush sofort und nach jedem Schreib- oder Druck auf den aktuell Ausgangskanal ausgewählt.

So könnte man "\n" zum Druck Aussagen anhängen oder - besser - Set $| = 1; auf Ihre zweite Skript (nur einmal, nicht für jede print). Dies wird die Ausgabe des 2. Skripts (in der Theorie) verlangsamen, aber für ein paar Zeilen wird es keinen Unterschied machen.

Verwandte Themen