Schrift
[thread]11516[/thread]

Windows "Eingabeaufforderung" und Perl



<< >> 4 Einträge, 1 Seite
AndiS
 2008-03-25 00:49
#107432 #107432
User since
2008-02-20
9 Artikel
BenutzerIn
[default_avatar]
Hallo!

Jetzt habe ich tagelang mein Perl-Script mit Eclipse + EPIC entwickelt und bin gerade am testen.
Habe das Script nun auch mal wie im Endeinsatz geplant über die Windows Eingabeaufforderung gestartet und gleich über ein blödes Problem gestolpert.

So wie es aussieht, kann die "super" Windows-Shell eine Zeile nur komplett ausgeben. und nicht in mehreren Teilen.

Ein Beispiel:

Code (perl): (dl )
1
2
3
print "Bitte kurz warten.... ";
sleep 10;
print "Fertig\n";


In der Eingabeaufforderung erscheint, dann aber nicht zuerst "Bitte kurz warten...", danach vergehen 10 sec und dann erscheint "Fertig", sondern es erscheint garnichts, 10 sec wird gewartet und dann erscheint die komplette Zeile.


Gibts da einen Trick?
Mit der in eclipse integrierten Console passiert das nicht.


Schöne Grüße,

AndiS
Ronnie
 2008-03-25 01:24
#107433 #107433
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Schau mal nach $| in perlvar.
sid burn
 2008-03-25 02:19
#107435 #107435
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das ganze hat nichts mit der Windows Shell zu tun. Sondern mit Standardmäßigen Pufferung.

Wie Ronnie sagte kannst du dir $| anschauen. Wenn du diese Variable auf einen wahren Wert setzt dann schaltest du den "autoflush" Modus auf den derzeit aktiven Filehandle ein. Standardmäßig ist STDOUT der aktive Filehandle.

Der Autoflush Modus bewirkt das der Buffer immer schnellstmöglicht geleert wird. Standardmäßig wird dieser bei einer Ausgabe nur dann geleert wenn ein Newline zeichen im Buffer ist. Daher bekommst du die Ausgabe also erst nach dem sleep() angezeigt.

Anstatt allerdiengs $| zu setzen würde ich dir lieber empfehlen das Modul "IO::Handle" zu laden und dort die Methode autoflush zu nutzen. Der Vorteil ist das es lesbarer ist. Und du für jeden beliebigen Handle den Autoflusch Modus setzen kannst. Mit der variable $| den autoflush Modus für einen anderen Handle zu setzen sieht etwas wirsch aus...

Hmm, nachteile hat es eigentlich keine.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
# Core Module
use strict;
use warnings;
use IO::Handle;

STDOUT->autoflush(1);
print "Bitte warten...";
sleep 3;
print "Fertig\n";


Und weitere Vorteile sind noch folgende Sachen. Wenn du nur zu einem bestimmten Zeitpunkt etwas flushen möchtest kannst du auch flush() aufrufen. Das heißt der Buffer wird geleert. Aber erst zu dem Zeitpunkt wo du es aufrufst.

Code: (dl )
1
2
3
4
print "Bitte warten...";
STDOUT->flush;
sleep 3;
print "Fertig\n";


Weiterhin gibt es noch eine printflush() Methode wo nur die Argumente direkt geflusht werden.

Code: (dl )
1
2
3
STDOUT->printflush("Bitte warten...");
sleep 3;
print "Fertig\n";
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
AndiS
 2008-03-25 12:34
#107442 #107442
User since
2008-02-20
9 Artikel
BenutzerIn
[default_avatar]
WOW, vielen Dank für die super Erklärung! Hab es gleich reingebaut und funktioniert natürlich!

Schöne Grüße,

AndiS
<< >> 4 Einträge, 1 Seite



View all threads created 2008-03-25 00:49.