Schleifen und Verzweigungen

[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]


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;
}
0
2
4
6
8

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";
10
9
8
7
6
5
4
3
2
1
Start!

[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]


[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]

Autor: Eike Grote Version: 2.07 (27.10.2019)