Was ist passiert? Oder, was hätte passieren sollen?
Zu Erwarten wäre gewesen, daß der Hautteil des Programmes 10mal durchlaufen wird, jeweils den Stand von $i ausgibt und die ansich sinnlose Subroutine changei aufruft.
Aber offensichtlich wurde die Schleife nur einmal durchlaufen, aber wieso?
Ganz einfach: Im Programmteil changei wird $i auf 20 gesetzt, somit ist der Schleifendurchlauf beendet worden.
Eine Variablenänderung in einer Unterroutine hat also Auswirkungen auf den Hauptteil des Programmes. Ja, es geht sogar weiter:
Falls per include ein weiterer Programmteil eingebunden wird, wirken sich auch darin enthaltene Variablenänderungen auf den Hauptteil aus.
Böse Sache, wenn man nicht aufpasst! Eine Fehlersuche wird dadurch sehr erschwert.
Was kann man tun?
Sie ahnen schon, da es hier um den my()-Befehl geht, ist besagtes my() die Lösung.
for (my $i=0;$i<10;$i++){ print "$i ";
&changei;
}
Ausgabe:
10
Tja, keine Ausgabe!
$j ist nur innerhalb der Schleife bekannt, außerhalb ist $j leer. Und in showi ist $i aber wiederum bekannt, deswegen die Ausgabe 10.
Der my-Befehl "schützt" also Variablen vor einer versehentlichen Änderung bzw. verhindert, daß eine Variable unbeabsichtigt gelöscht wird.
Kommentare zum Beitrag "my in Perl"
Kommentar von Reinhold
Unterstes Beispiel:
Da erhalte ich die Ausgabe 10
:-)
Kommentar von Anon
Das unterste Beispiel ist FALSCH! Bitte korrigieren, hat mich ziemlich verwirrt, da diese Seite der erste google-Link für "Perl my" ist.
Eine mit my definierte Variable existiert auch in inneren Scopes (subroutinen, schleifen etc.).
Kommentar von Anon
Um es noch etwas anders zu formulieren:
Eine mit my definierte Variable existiert auch in Scopes, die im selben Scope definiert wurden, wie die Variable.