# Schleifen und Verzweigungen

- `while` und `until`
- `for` und `foreach`
- Bedingte Verzweigung mit `if` und `unless`
- Beeinflussen des Ablaufs einer Schleife

## `while` und `until`

`#!/usr/local/bin/perl -w use strict; my $i = 0; while($i < 10) { print "$i\n"; $i += 2; } until($i == 5) { print "$i\n"; $i --; }`

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.

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.

Obiges Programm liefert demzufolge die Ausgabe

`0 2 4 6 8 10 9 8 7 6`

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

Autor: Eike Grote | Version: 2.05 (24.1.2012)