Der Befehl goto ist vielen wahrscheinlich auch aus anderen Sprachen bekannt und erlaubt das Springen zu einer Codestelle im Script. Allerdings: Der Befehl goto ist eigentlich DER Befehl, der für ineffiziente und unübersichtliche Programmierung steht.
Syntax
goto SPRUNGMARKE;
wobei die Sprungmarke als
SPRUNGMARKE:
im Code steht.
Wie man im Beispiel sieht, bringt goto etwas Verwirrung in das Script, man hätte es auch leichter haben können. Generell kann man sagen, daß es eigentlich immer (ich hab noch keinen anderen Fall erlebt) auch ohne goto geht, wenn man Schleifen oder if-Verzweigungen verwendet.
Nächstes Beispiel
$summe=0;
for ($i=0;$i<10;$i++){
if ($i <5){goto KLEINER;} print "\$i ist größer oder gleich 5, \$i = $i\n";
Zurueck:
} print "Die Summe aller Zahlen kleiner 5 ist $summe";
exit;
Es wird 5 mal die Zeile "$i ist kleiner 5..." ausgegeben und 5 mal "$i ist größer oder gleich 5..." und schließlich die Summe aller Zahlen kleiner 5, also 10.
Wie man sieht wird in der Schleife immer per goto in den Programmteil KLEINER: gesprungen und dann wieder zurück zu Zurueck: ... sehr unelegant! Man hätte dieses Problem besser mit einer Unterfuntion gelöst.
Kommentare zum Beitrag "goto in Perl oder: Wie erzeuge ich Spaghetti-Code"
Kommentar von schraat
In manchen Fällen macht es durchaus Sinn.
Z.B.: Das Programm erwartet eine Eingabe (z.B. Zahl 0-9) <STDIN>.
Bei fehlerhafter Eingabe (z.B. 11) -> Programabbruch und Sprung zurück zur Eingabeaufforderung.
START:
print "\nSchaltjahr, ja oder nein?
\nBitte geben Sie eine Jahreszahl zwischen 0 und 2009 ein: ";
chomp (my$jahreszahl=<STDIN>);print "\n";
if ($jahreszahl < 0) {
print "Die angegebene Jahreszahl muß 0 oder größer als 0 sein!
Bitte Eingabe wiederholen.\n\n"; {
sleep 3; goto START;
}}
Kommentar von Andi
while (1) {
print "\nSchaltjahr, ja oder nein?
\nBitte geben Sie eine Jahreszahl zwischen 0 und 2009 ein: ";
chomp my$jahreszahl=<STDIN>);print "\n";
if ($jahreszahl < 0) {
print "Die angegebene Jahreszahl muss 0 oder größer als 0 sein!
Bitte Eingabe wiederholen.\n\n";
} else {
last;
}
}