ToDo: Kontrolle

Hamsterskript: Verzweigungen

Verzweigung in Anweisungsfolgen

Eine Verzweigung ermöglicht die alternative Ausführung einer oder mehrerer Anweisungen. Ihr Selektor bestimmt die auszuführende Alternative, er ist als Boolescher Ausdruck anzugeben.

Die Verzweigung ist durch das Schlüsselwort „if()“ einzuleiten, dem die zu prüfende Bedingung als Boolescher Ausdruck in runden Klammern folgt. In der nächsten Zeile folgen alle Anweisungen, die bei Erfüllung der Bedingung ausgeführt werden sollen. Nach der letzten Anweisungszeile wird die Verzweigung durch das Schlüsselwort „endif“ abgeschlossen:

if( $a < $b )
  print( "Bedingung erfüllt." )
endif

Das Beispiel gibt den Text „Bedingung erfüllt.“ durch Ausführung der „print()“-Anweisung nur dann aus, wenn der Boolesche Ausdruck „$a < $b“ den Wert 1 (Bedingung erfüllt) liefert, also die Variable $a einen kleineren Wert als $b enthält. Alle auf „endif“ folgenden Anweisungen würden wieder unbedingt in jedem Falle ausgeführt.

Das Schlüsselwort „else“ leitet eine Reihe von Anweisungen ein, die im Falle der Nichterfüllung auszuführen sind:

if( $a < $b )
  print( "Bedingung erfüllt." )
 else
  print( "Bedingung leider nicht erfüllt!" )
endif
Dieses Beispiel verhält sich wie das vorhergehende; sofern die Variable $a allerdings keinen kleineren Wert als die Variable $b enthält (also „$a > $b“ oder „$a = $b“ gilt), wird jetzt der Text „Bedingung leider nicht erfüllt!“ ausgegeben.

Das Schlüsselwort „elseif“ leitet, gekoppelt an eine weitere Bedingung, eine Reihe von Anweisungen ein, die im Falle der Nichterfüllung der ersten „if“-Anweisung auszuführen sind:

if( $a < $b )
  print( "Bedingung_1 erfüllt." )
 elseif( $a = $b )
  print( "Bedingung_1 nicht erfüllt, aber Bedingung_2 erfüllt." )
 else
  print( "Keine der beiden Bedingungen erfüllt!" )
endif

Verzweigung innerhalb von Ausdrücken

Innerhalb eines Ausdrucks kann der „iif()“-Operator verwendet werden. Die Verzweigung

if( $a < $b )
  $x = $b - $a
 else
  $x = $a - $b
endif

kann auch durch die Zeile

$x = iif( $a < $b, $b - $a, $a - $b )

ausgedrückt werden. Ist die Bedingung „$a < $b“ erfüllt, wird $x der Wert des Ausdrucks „$b - $a“ zugewiesen, anderenfalls der Wert des letzten Ausdrucks „$a - $b“. Es wird nur derjenige Ausdruck berechnet, dessen Wert der „iif()“-Operator zurückgibt. In der Zeile

$x = iif( $a < $b, $b - $a, calc( $c ) )

wird „calc( $c )“ also nicht aufgerufen, wenn die Bedingung „$a < $b“ erfüllt ist und daher das Resultat von „$b - $a“ zurückzugeben ist.

Auch der „icase()“-Operator kann innerhalb von Ausdrücken verwendet werden. Als Selektor dient ein Ausdruck, dessen Wert aus mehr als nur zwei Alternativen auswählen kann. Die Anweisung im folgenden Beispiel wurde der Übersichtlichkeit halber auf mehrere Textzeilen verteilt und durch die Unterstriche „_“ zu einer Anweisungszeile zusammengefügt; das empfiehlt sich auch in eigenen Skripten. Die Zeile

$x = icase( $a + $b, 1, "Erster Ausdruck", _
                     2, "Zweiter Ausdruck", _
                     3, "Dritter Ausdruck", _
                  else, "Unbekannter Wert!" )
weist $x das Literal „Erster Ausdruck“ zu, wenn der Ausdruck „$a + $b“ den Wert 1 hat, das Literal „Zweiter Ausdruck“, wenn er den Wert 2 hat usw. Das Schlüsselwort „else“ steht stellvertretend für alle anderen Werte; wenn der Ausdruck „$a + $b“ im Beispiel also einen anderen Wert als 1, 2 oder 3 hat, wird $x das Literal „Unbekannter Wert!“ zugewiesen. Der „else“-Zweig ist optional. Auch der „icase()“-Operator berechnet nur den Ausdruck, dessen Wert zurückgegeben wird. Allgemein hat der „icase()“-Operator folgende Syntax:
icase( <exp_selector>,
       <expression_alternative_1>, <expression_result_1>, _
       <expression_alternative_2>, <expression_result_2>, _
       ...
       <expression_alternative_n>, <expression_result_n>[, _
       else, <expression_result_else>] )

An jeder Stelle können also nicht nur Werte oder einzelne Variablen, sondern auch Ausdrücke verwendet werden. Der Operator muss nicht auf mehrere Textzeilen verteilt werden, wie dies hier aus Gründen der Übersicht geschieht.