In Perl wird die Sichtbarkeit von Variablen durch die Schlüsselwörter my und local bestimmt.
my erstellt eine Variable mit lexikalischem Geltungsbereich (wirkt nur im aktuellen Block).local speichert den aktuellen Wert einer globalen Variable vorübergehend und setzt einen neuen Wert für die Dauer des Blocks — wird häufig nur mit globalen Variablen verwendet (z. B. $_, $/ usw.).Beispiel:
my $x = 42; # nur im aktuellen Block sichtbar { local $/ = undef; my $input = <STDIN>; # $/ ist hier undef, nach dem Block wird der Wert wiederhergestellt }
Es wird empfohlen, my zu verwenden, da es einen vorhersehbareren Geltungsbereich hat.
Was passiert, wenn my und local mit derselben Variable verwendet werden, die in zwei verschiedenen Blöcken deklariert wurde?
Oft wird geantwortet, dass
localundmygleich arbeiten, aber das ist nicht der Fall.localfunktioniert nur mit globalen Variablen (Paketvariablen). Eine mitmydeklarierte Variable ist fürlocalunsichtbar.
Beispiel:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo außerhalb des Blocks — globale Version, nicht "lexical"
Geschichte
Im Skript wurde local zur vorübergehenden Änderung einer durch my deklarierten Variablen verwendet, was zu keinen Ergebnissen führte und Bugs bei der Ereignisverarbeitung in einem der internen Module verursachte.
Geschichte
Im Projekt wurde $_ innerhalb von foreach durch local "lokalisiert", in der Erwartung, $_ für Iteratoren zu ersetzen, und vergaß, dass foreach bereits ein neues $_ festlegt. Ergebnis — ein nicht funktionierender Filter und falsche Iterationslogik.
Geschichte
Die globale Paketvariable war nicht durch our deklariert, und der Versuch, sie durch local $var zu lokalisieren, führte zum Absturz des Skripts aufgrund von strict und warning, und die Fehlersuche dauerte einen Tag.