Schleifen und Verzweigungen
while
und
until
Bei der while
-Schleife wird zuerst das Argument
überprüft. Falls dies wahr liefert, wird der
Schleifenblock ausgeführt. Dies wiederholt sich so lange, bis das
while
-Argument falsch ist.
#!/usr/local/bin/perl -w
use strict;
my $i = 0; while($i < 10) { print "$i\n"; $i += 2; }
|
|
Die Schleife bricht also ab, sobald der Wert 10 erreicht ist (der Inhalt der Schleife
wird dann nicht mehr ausgeführt).
Die Negation der while
-Schleife ist die Konstruktion
mit Hilfe von until
. Hier wird der Schleifenkörper
so lange wiederholt bis das Argument von until
den
Wert wahr liefert.
#!/usr/local/bin/perl -w
use strict;
my $i = 10; until($i == 0) { print "$i\n"; sleep 1; $i --; } print "Start!\n";
|
|
[Seitenanfang]
for
und
foreach
Folgendes Programm schreibt die Zahlen von 1 bis 10 auf den
Bildschirm:
#!/usr/local/bin/perl -w
use strict;
for(my $i = 1;$i <= 10;$i++) { print "$i\n"; }
|
|
Zuerst wird die Anweisung im 1.Argument von for
ausgeführt. Anschließend wird das 2.Argument
überprüft. Liefert diese Abfrage eine wahre Aussage
(true), so wird der Schleifenblock ausgeführt.
Nach dem Block wird das 3.Argument von for
ausgewertet
und dann wieder das Argument Nummer 2 überprüft. Dies
wiederholt sich so lange, bis die Bedingung (Argument 2) nicht mehr
erfüllt ist (Wert falsch). Dann fährt das Programm
in der Zeile nach dem Schleifenblock fort.
Die for
-Schleife ist eigentlich nur eine vereinfachte
Schreibweise; obiges Beispielprogramm läßt sich auch
wie folgt schreiben:
#!/usr/local/bin/perl -w
use strict;
my $i = 1; while($i <= 10) { print "$i\n"; $i++; }
|
|
Anstatt der drei durch Semikolons getrennten Argumente, kann
for
auch eine Liste übergeben werden, die
dann sukzessive abgearbeitet wird. Aus Gründen der
Übersichtlichkeit sollte in so einem Falle aber an Stelle
von for
das äquivalente foreach
stehen. Die einzelnen Zeilen des folgenden Skripts leisten alle
das gleiche: Sie geben die Zahlen von 1 bis 10 aus.
#!/usr/local/bin/perl -w
use strict;
for((1,2,3,4,5,6,7,8,9,10)) { print $_."\n" } foreach((1,2,3,4,5,6,7,8,9,10)) { print $_."\n" } foreach(1..10) { print $_."\n" } foreach my $nr (1..10) { print $nr."\n" }
|
|
Die dritte und vierte Zeile verwenden den Bereichsoperator
(range operator) aus zwei Punkten: "..
".
Wird er, wie in
diesem Falle, im Listenkontext benutzt, so liefert er eine Liste, die mit
der ersten Zahl beginnt und mit der zweiten endet (ist der erste Operand
größer als der zweite, erhält man eine leere Liste).
Dies funktioniert auch mit Zeichenketten, wobei die Liste dann aus
Strings besteht, die sich im alphabetischen Sinne vom ersten zum zweiten
Operanden erstreckt.
In der letzten Zeile sieht man, wie das gerade von foreach
bearbeitete Listenelement einer Variablen zugewiesen werden kann. Wird
keine solche Variable angegeben, so steht der aktuelle Listenwert
in der speziellen Variablen $_
.
[Seitenanfang]
Bedingte Verzweigung mit if
und unless
#!/usr/local/bin/perl -w
use strict;
for(my $i = 1;$i <= 5;$i ++) { if ($i < 3) { print "($i) kleiner als 3\n" } elsif ($i == 4) { print "($i) gleich 4\n" } elsif ($i > 4) { print "($i) größer als 4\n" } else { print "($i) keine Bedingung erfüllt\n" } unless($i == 2) { print "[$i] ungleich 2\n" } }
|
|
(1) kleiner als 3 [1] ungleich 2 (2) kleiner als 3 (3) keine Bedingung erfüllt [3] ungleich 2 (4) gleich 4 [4] ungleich 2 (5) größer als 4 [5] ungleich 2
|
|
Das Argument von if
ist eine Bedingung,
die entweder wahr (true) oder falsch (false) ist. Im Falle
von "wahr" wird der Block nach if
ausgeführt. Ist die
if
-Bedingung falsch, so wird (falls vorhanden) das
Argument des ersten elsif
ausgewertet. Liefert auch
dieses nicht den Wert wahr, kommt das nächste elsif
an die Reihe; so lange bis entweder eine Bedingung wahr ist, keine
Bedingungen mehr vorhanden sind oder ein abschließendes
else
erreicht wird, dessen Block
ausgeführt wird, falls kein anderer Block in Frage kommt.
Im Gegensatz zu anderen Programmiersprachen wie z.B. C muß
der Block nach einem if
, elsif
oder
else
immer in geschweiften Klammern stehen; dadurch
werden eventuelle Mehrdeutigkeiten vermieden.
Das Gegenstück von if
ist
unless
, dessen
Block nur ausgeführt wird, wenn die Bedingung im Argument den Wert
falsch liefert.
Eine Alternative zu einer if
-else
-Konstruktion
ist die Verwendung des Operators "?:
":
$v == 1 ? print "v gleich 1" : print "v ungleich 1";
[Seitenanfang]
Beeinflussen des Ablaufs einer Schleife
Mit Hilfe der Funktionen next
und
last
läßt sich der Ablauf
einer Schleife gezielt steuern. So kann man einzelne Durchläufe
überspringen oder eine Schleife vorzeitig beenden.
#!/usr/local/bin/perl -w
use strict;
for(my $i = 0; $i < 9; $i++) { print "$i " } print "\n";
for(my $i = 0; $i < 9; $i++) { if($i == 4) { next } # '4' überspringen print "$i "; } print "\n";
for(my $i = 0; $i < 9; $i++) { if($i == 4) { last } # bei '4' abbrechen print "$i "; } print "\n";
|
|
0 1 2 3 4 5 6 7 8 0 1 2 3 5 6 7 8 0 1 2 3
|
|
[Seitenanfang]