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.
#!/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.
print "Bitte warten...";
STDOUT->flush;
sleep 3;
print "Fertig\n";
Weiterhin gibt es noch eine printflush() Methode wo nur die Argumente direkt geflusht werden.
STDOUT->printflush("Bitte warten...");
sleep 3;
print "Fertig\n";
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de