In Perl können Variablen lexikalisches oder dynamisches Scoping haben.
my erstellt eine Variable mit lexikalischem Scoping: die Variable ist nur innerhalb des Blocks sichtbar, in dem sie definiert ist.local überschreibt vorübergehend den Wert einer globalen (Package-)Variablen mit dynamischem Scoping: der neue Wert ist in allen aufgerufenen Funktionen bis zum Verlassen des Blocks sichtbar.our definiert eine globale (Package-)Variable, die jedoch nur im aktuellen lexikalischen Block sichtbar ist.Beispiel:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Gibt 10 aus — my $x ist nicht in inner sichtbar $| = 1; test_loc(); # Gibt 30 aus — local $x ist in inner sichtbar
local wird verwendet, um spezielle Package-Variablen wie $_, $/, $@ und andere zu ändern.
Was wird das Ergebnis der Ausführung des folgenden Codes sein und warum?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
Antwort: Gibt 5 aus. Weil die my-Variable $a aus outer in inner nicht sichtbar ist; es wird die Package-Variable $a verwendet, die über our deklariert ist.
Geschichte
Geschichte
Geschichte
In der JavaScript-Entwicklung versuchten Entwickler nach dem Wechsel zu Perl aus Gewohnheit, Variablen überall ohne Notwendigkeit mit our zu deklarieren, was dazu führte, dass unerwartete globale Variablen entstanden, die die Kapselung und das Auftreten von Namenskonflikten störten.