CGI: Programmsteuerung
von Marcus Engelhardt
Durch die Verwendung einiger Sprungbefehle kann man ein Script sehr effektiv flexibilisieren. Welche es wofür gibt, zeigt dieses Kapitel.
Der Befehl continue kann beispielsweise in Verbindung mit Schleifen eingesetzt werden. Er leitet einen Anweisungsblock ein, welcher, wenn er direkt hinter dem Schleifenkörper steht, vor jedem Durchlauf der Schleife ergänzend ausgeführt wird:
$Zahl = 0;
until($Zahl == 4)
{ print $Zahl; }
continue
{ $Zahl++; }
Im Beispiel ist daher im Anweisungsblock der Schleife die Wertänderung von $Zahl nicht notwendig, da durch den Befehl continue $Zahl bereits vor jedem Schleifendurchlauf um 1 erhöht wird.
Mithilfe von goto kann man zu einer vorher definierten (!) Stelle im Script springen, so dass die dazwischen stehenden Anweisungen nicht ausgeführt werden. Die Deklaration und Ansteuerung dieser Stellen erfolgt durch so genannte Labels, welche der besseren Übersicht wegen in Großbuchstaben notiert werden sollten. Bei der Deklaration eines Labels folgt diesem ein Doppelpunkt (:). Der Sprung zu einem Label erfolgt mittels goto gefolgt von dem Label. Da dies eine Anweisung ist, darf der Strichpunkt (;) am Ende nicht vergessen werden:
ANWEISUNG1: #Label für ANWEISUNG1
print "Anw. 1";
goto ANWEISUNG3; #Springt zu ANWEISUNG3
ANWEISUNG2: #Label für ANWEISUNG2
print "Anw. 2";
ANWEISUNG3:
print "Anw. 3"; #Label für ANWEISUNG3
Durch die Anweisung goto ANWEISUNG3; wird die Ausgabe in ANWEISUNG2 nicht ausgeführt.
Mithilfe von last und der nachfolgenden Bedingung kann eine Schleife (vorzeitig) abgebrochen werden:
while($Zahl < 4)
{
print $Zahl;
last if ($Zahl2 == 2);
#Bricht Schleife ab, wenn $Zahl2 gleich 2
$Zahl++; #Inkrementation von $Zahl
$Zahl2++; #Inkrementation von $Zahl2
}
Normalerweise würde die Schleife erst dann abgebrochen werden, wenn das Argument von while false, also $Zahl größer/gleich 4, wäre. Durch den Befehl last wird die Schleife jedoch schon abgebrochen, wenn $Zahl2 den Wert 2 erreicht.
Mit dem Befehl next kann man einen aktuellen Schleifendurchlauf abbrechen, wenn die dahinter folgende Bedingung true ergibt. Die nachfolgenden Anweisungen werden dann solange nicht ausgeführt, bis diese Bedingung wieder false ergibt:
foreach $Zahl (1..10)
{
next if (($Zahl > 3) && ($Zahl < 6));
print $Zahl; #Gibt 123678910 aus
}
Im Beispiel hat der Befehl next mit nachfolgender komplexer Bedingung zur Folge, dass $Zahl als aktuelles Element der Liste nicht ausgegeben wird, wenn die Auswertung des Arguments ($Zahl > 3) && ($Zahl < 6) true ergibt. Alle Zahlen größer 3 und kleiner 6, also 4 und 5, werden nicht ausgegeben, da der jeweilige Schleifendurchlauf durch next abgebrochen wird.
Mittels des Befehls redo wird ein aktueller Schleifendurchlauf nochmals ausgeführt, ohne dass die dazugehörige Schleifenbedingung wiederholt geprüft wird:
foreach $Zahl (1..2)
{
print $Zahl; #Gibt 12323 aus
$Zahl++;
redo if ($Zahl < 4);
}
Die Schleife soll laut Argument hinter foreach insgesamt dreimal durchlaufen und $Zahl dabei mit dem Wert des aktuellen Listenelements belegt werden.
Innerhalb des Anweisungsblocks der Schleife wird $Zahl nach Ausgabe an den Browser wiederum stets um 1 erhöht. Durch die Anweisung redo if ($Zahl < 4); wird jedoch erreicht, dass der aktuelle Schleifendurchlauf wiederholt wird, $Zahl also immer wieder ausgegeben und um 1 erhöht wird, bis $Zahl nicht mehr kleiner als 4 ist. Dabei wird die Schleifenbedingung nicht neu ausgewertet, der Wert von $Zahl von ihr also nicht neu gesetzt. Anschließend erfolgt ein neuer Schleifendurchlauf mit Auswertung der Schleifenbedingung. $Zahl erhält als Wert ein neues Listenelement und das ganze geht nun mit erhöhten Startwert wieder von vorn los.