ProgrammierungSenior Perl Entwickler

Erzählen Sie von den Besonderheiten der Variablen-Sichtbarkeit in Perl. Welche Nuancen gibt es bei den Operatoren my und local?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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.

Fangfrage

Was passiert, wenn my und local mit derselben Variable verwendet werden, die in zwei verschiedenen Blöcken deklariert wurde?

Oft wird geantwortet, dass local und my gleich arbeiten, aber das ist nicht der Fall. local funktioniert nur mit globalen Variablen (Paketvariablen). Eine mit my deklarierte Variable ist für local unsichtbar.

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"

Beispiele realer Fehler aufgrund von Unkenntnis der Feinheiten des Themas


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.