# Perl - Kontrollstrukturen

### Bedingte Verzweigung

    #!/usr/local/bin/perl -w

    for($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 der anderen Bedingungen erfüllt\n" }

      unless($i == 2) { print "[$i] ungleich 2\n" }
    }

    (1) kleiner als 3
    [1] ungleich 2
    (2) kleiner als 3
    (3) keine der anderen Bedingungen erfuellt
    [3] ungleich 2
    (4) gleich 4
    [4] ungleich 2
    (5) groesser 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 true, 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 infrage 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 false liefert.

Eine Alternative zu einer `if`-`else`-Konstruktion ist die Verwendung des Operators "`?:`":

    $a == 1 ? print "a gleich 1" : print "a ungleich 1";

### `while` und `until`

    #!/usr/local/bin/perl -w

    $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 true liefert, wird der Schleifenblock ausgeführt. Dies wiederholt sich so lange, bis das `while`-Argument false 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 true liefert. Obiges Programm liefert demzufolge die Ausgabe

    0
    2
    4
    6
    8
    10
    9
    8
    7
    6

### `for` und `foreach`

Folgendes Programm schreibt die Zahlen von 1 bis 10 auf den Bildschirm:

    #!/usr/local/bin/perl -w

    for($i = 1;$i <= 10;$i++) { print "$i\n"; }

Zu allererst 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 false). 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

    $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

    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 $nr (1..10) { print $nr."\n" }

In der letzten Zeilen 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 `$_`.

Autor: Eike Grote | Letzte Änderung: 03.11.2004