Thomas: Sleep-Funktion in Perl

Hallo Leute!

Nun, ich hab zu Testzwecken folgende kleine Until-Schleife:

$i = '0'

until($i == '10') {

print "*";
$i++;
sleep(1);
}

Ich möchte einfach, dass man sieht, wie jedes Sternchen einzeln angezeigt wird, und sich der "Balken" langsam aufbaut.

Leider ist es mit diesem Script so, dass er 10 Sekunden wartet, und dann alle 10 Sternchen auf einmal hinschreibt, anstatt jedes einzeln mit 1 Sekunde dazwischen :o(

Was stimmt daran nicht?

Gruß, Thomas

  1. use Mosche;

    $i = '0'

    Du willst $i doch eigentlich den numerischen Wert 0 geben, und nicht den String '0';

    until($i == '10') {

    Du benutzt einen numerischen Vergleich mit einem String:
    until ($i == 10)

    print "*";
    $i++;
    sleep(1);
    }

    Leider ist es mit diesem Script so, dass er 10 Sekunden wartet, und dann alle 10 Sternchen auf einmal hinschreibt, anstatt jedes einzeln mit 1 Sekunde dazwischen :o(

    Was stimmt daran nicht?

    Perl buffert deine Ausgaben. Setze irgendwo vor diesen Codeteil
    $| = 1;
    dann gehts. Korrigier noch deine anderen Fehler.
    Um zu verstehen, was '$| = 1;' macht, lies 'perldoc perlvar'.

    use Tschoe qw(Matti);

  2. Hallo Thomas,

    Leider ist es mit diesem Script so, dass er 10 Sekunden wartet, und dann alle 10 Sternchen auf einmal hinschreibt, anstatt jedes einzeln mit 1 Sekunde dazwischen :o(

    Was stimmt daran nicht?

    Das dürfte nicht am Script liegen, sondern am Web-Server (bzw. am Betriebssystem), der Deine Scriptausgaben puffert und nicht jedes einzelne Sternchen als einzelnes TCP/IP-Paket zum Browser abschickt. Wenn Du diesen Sternchen-Effekt unbedingt erzielen möchtest, wäre es einfacher das auf Client-Seite zu realisieren, mit einem in der Ausgabe eingebetteten Java-Script [window.setInterval... document.write('*');].

    CU Christoph

    1. Hallo Christoph!

      Das dürfte nicht am Script liegen, sondern am Web-Server (bzw. am Betriebssystem), der Deine Scriptausgaben puffert und nicht jedes einzelne Sternchen als einzelnes TCP/IP-Paket zum Browser abschickt. Wenn Du diesen Sternchen-Effekt unbedingt erzielen möchtest, wäre es einfacher das auf Client-Seite zu realisieren, mit einem in der Ausgabe eingebetteten Java-Script [window.setInterval... document.write('*');].

      JavaScript wird hier nicht gehen. Da ich meine Perl-Programme nur in der Konsole aufrufe (kein CGI).

      Aber trotzdem danke.

      Thomas

      1. use Mosche;

        JavaScript wird hier nicht gehen. Da ich meine Perl-Programme nur in der Konsole aufrufe (kein CGI).

        Funktioniert es denn mit meinem Vorschlag?

        use Tschoe qw(Matti);