|
Schleifen mit while/until
Schleifen mit do..while/until
Schleifen mit for/foreach
Sprungbefehle in Perl
#!/usr/bin/perl $i = 1; print "zuerst die Wurzeln von 1 bis 10...\n\n"; while($i <= 10) { print "Die Wurzel von ", $i, " ist ", sqrt($i), "\n"; $i++; } $i = 1; print "und jetzt die Quadratzahlen von 1 bis 10...\n\n"; until($i > 10) { print "Das Quadrat von ", $i, " ist ", $i * $i, "\n"; $i++; } |
#!/usr/bin/perl $AccessDatei = "../../docs/access.log"; $Zugriffe = 0; $Erfolge = 0; open(DATEI, "<".$AccessDatei) || die "Datei nicht gefunden!\n"; { while(<DATEI>) { if(/HTTP\/1.0" 200/) # nach 'HTTP/1.0" 200' suchen (= erfolgreicher Zugriff) { $Erfolge++; } $Zugriffe++; } } print "Von ", $Zugriffe, " Zugriffen waren ", $Erfolge, " erfolgreich\n"; |
Eine until-Schleife (wie im obigen Beispiel 1, zweiter Teil) beginnt mit dem Wort until (until = bis). Dabei handelt es sich um eine andere logische Formulierung als bei while. Der Inhalt der Schleife wird solange wiederholt, bis die Schleifenbedingung wahr ist. Ansonsten gelten für until-Schleifen die gleichen Regeln wie für while-Schleifen. Achten Sie jedoch auf eine genaue logische Formulierung der Schleifenbedingung! So bedeuten im Beispiel die Schleifenbedingungen while($i <= 10) und until($i > 10) genau das gleiche.
Das obige Beispiel 2 zeigt einen speziellen, Perl-typischen Anwendungsfall der Schleife mit while. In dem Beispiel wird eine Datei zeilenweise eingelesen. Es handelt sich um eine Log-Datei, wie sie ein WWW-Server zum Protokollieren der Zugriffe erzeugt. In diesem speziellen Fall ist für die Schleifenbedingung kein Vergleichsoperator nötig. Die Schleife bricht automatisch ab, wenn alle Zeilen der Datei gelesen wurden (zu diesem Beispiel siehe auch Dateien lesen und schreiben sowie für das Suchen nach Zeichenketten den Abschnitt Reguläre Ausdrücke).
Notieren Sie Anweisungen innerhalb der Schleifen immer in geschweiften Klammern { und }, auch wenn es nur eine einzige Anweisung ist.
Um Endlosschleifen zu vermeiden, brauchen Sie irgendetwas, das irgendwann zu einem Ausweg aus der Schleife führt. Meistens werden zu diesem Zweck sogenannte "Zähler" definiert, im Beispiel 1 etwa der Skalar $i. Dieser Skalar hat im Beispiel einen Anfangswert von 1 und wird innerhalb der Schleife bei jedem Durchgang mit der Anweisung $i++; um 1 erhöht, so daß die Schleifenbedingung irgendwann erreicht wird.
Eine andere Möglichkeit, Schleifen zu kontrollieren und abzubrechen, bieten die Sprungbefehle.
#!/usr/bin/perl $Name = "Stefan"; do { print $Name, "\n"; $Name = "Virtuella"; } while($Name ne "Virtuella") |
#!/usr/bin/perl $Name = "Stefan"; do { print $Name, "\n"; $Name = "Virtuella"; } until($Name eq "Virtuella") |
#!/usr/bin/perl for($i=0;$i<=255;$i++) { printf("%4d = %2X",$i, $i); if($i % 8 == 0) { print "\n"; } } |
#!/usr/bin/perl @Alphabet = (A..Z); for(@Alphabet) { print $_, " ist der ", $i+1, ". Buchstabe im Alphabet\n"; $i++; } |
#!/usr/bin/perl foreach $i (1..100) { next if $i % 2 == 0; print $i, "\n" if $i % 3 == 0; } |
Das obige Beispiel 2 zeigt einen speziellen, Perl-typischen Anwendungsfall der for-Schleife. Diese Form ist sehr praktisch, um Elemente einer Liste oder eines Hashs der Reihe nach abzuarbeiten. Im Beispiel 2 wird eine Liste @Alphabet mit allen Großbuchstaben des Alphabets definiert. Mit der Anweisung for(@Alphabet) wird eine Schleife über diese Liste gelegt. Die Schleife wird automatisch so oft durchlaufen, wie die Liste Elemente hat. Um das jeweils aktuelle Listenelement anzusprechen, wird innerhalb der Schleife die vordefinierte Variable $_ verwendet. In ihr ist der Inhalt des jeweils aktuellen Listenelements gespeichert.
Eine weitere Perl-typische Konstruktion ist eine Schleife mit foreach. Im obigen Beispiel 3 kommt eine solche Schleife zum Einsatz. Bei diesem Schleifentyp wird als Schleifenbedingung in Klammern ein eindeutiger Bereich definiert, z.B. (von Zahl..bis Zahl) oder Buchstaben (von Buchstabe..bis Buchstabe). Die Schleife wird automatisch so oft durchlaufen, bis alle Elemente innerhalb des definierten Bereichs abgearbeitet sind.
Wenn Sie einen Zähler innerhalb der Schleife für die gewünschte Prozedur einsetzen wollen, können Sie eine Zählervariable zwischen foreach und der Schleifenbedingung definieren, so wie in Beispiel 3 oben der Skalar $i.
Das obige Beispiel 3 gibt alle Zahlen zwischen 1 und 100 aus, die ungerade und durch 3 teilbar sind. Dabei hilft der Sprungbefehl next.
#!/usr/bin/perl # Raten Sie mal, welche Zahl $i am Ende als Ergebnis ausgibt $i = 1; goto Ergebnis; while($i < 1000) { ++$i; if($i % 3 == 0) { redo; } elsif($i % 7 == 0) { next; } elsif($i % 13 == 0) { last; } elsif($i % 17 == 0) { continue; } } Ergebnis: print "Ergebnis: ", $i; |
#!/usr/bin/perl while($i < 10) { ++$i; if($i % 2 != 0) { redo; } } continue { print $i, "\n"; } |
goto springt zu einer beliebigen anderen Stelle im Programm. Dazu muß diese Stelle jedoch ein "Label" erhalten (vergleichbar mit einem Verweisanker innerhalb einer HTML-Datei). Ein Label definieren Sie, indem Sie einen Namen notieren und dahinter einen Doppelpunkt. Im obigen Beispiel wird in der vorletzten Zeile ein Label mit dem Namen Ergebnis: definiert. Mit einem goto-Befehl wie am Beginn des Beispiels können Sie zu einem solchen Label springen.
redo ist zur Verwendung innerhalb von Schleifen gedacht. Der aktuelle Schleifendurchgang wird abgebrochen. Der nächste Schleifendurchgang wird gestartet, allerdings ohne daß die Schleifenbedingung neu bewertet wird. Wenn Sie also beispielsweise einen Zähler in einer Schleifenbedingung hochzählen, wird die Schleife bei redo erneut durchlaufen, ohne daß der Zähler weiter hochgezählt wird.
next ist ebenfalls zur Verwendung innerhalb von Schleifen gedacht. Der aktuelle Schleifendurchgang wird abgebrochen. Der nächste Schleifendurchgang wird gestartet, und die Schleifenbedingung wird dabei ebenfalls ausgewertet.
last bricht eine Schleife sofort ab.
continue ist in Perl ein Spezialfall und anders zu behandeln als etwa in C. Das obige Beispiel 2 zeigt eine typische Verwendungsweise. continue leitet einen eigenen Anweisungsblock ein, genauso wie eine Schleife. Innerhalb dieses Anweisungsblocks, der wie üblich mit geschweiften Klammern { und } markiert wird, können Sie beliebige Anweisungen notieren. Wenn ein solcher continue-Block unmittelbar hinter einem Schleifenblock steht, wird er mit jedem Schleifendurchlauf mit durchlaufen. Mit einem Sprungbefehl wie redo innerhalb des Schleifenblocks können Sie verhindern, daß der continue-Block ausgeführt wird. Im obigen Beispiel 2 wird mit dieser Konstruktion erreicht, daß alle geraden Zahlen zwischen 1 und 10 ausgegeben werden.
Blättern: | |||
Bedingte Anweisungen | Operatoren |
HTML-Dateien selbst erstellen | |||
Dokumentation: CGI/Perl | |||
CGI und Perl: Perl Sprachelemente |
© 1997 Stefan Münz, s.muenz@euromail.com