In Perl wordt de scope van variabelen bepaald door de sleutelwoorden my en local.
my creëert een variabele met lexicale scope (is alleen geldig in de huidige block).local slaat tijdelijk de huidige waarde van een globale variabele op en stelt een nieuwe in voor de duur van het bestaan van het block — wordt meestal alleen gebruikt met globale variabelen (bijvoorbeeld, $_, $/ enzovoort).Voorbeeld:
my $x = 42; # zichtbaar alleen in de huidige block { local $/ = undef; my $input = <STDIN>; # $/ is hier undef, na de block herstelt het de waarde }
Het is beter om my te gebruiken vanwege de voorspelbaardere scope.
Wat gebeurt er als je my en local gebruikt met dezelfde variabele, gedeclareerd in twee verschillende blocks?
Vaak antwoorden mensen dat
localenmyhetzelfde werken, maar dat is niet het geval.localwerkt alleen met globale variabelen (package variables). Een variabele gedeclareerd metmyis onzichtbaar voorlocal.
Voorbeeld:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo buiten de block — de globale versie, niet "lexical"
Verhaal
In het script werd local gebruikt voor tijdelijke vervanging van een variabele die met my was gedeclareerd, wat leidde tot geen enkel resultaat en bugs in de gebeurtenisverwerking in een van de interne modules.
Verhaal
In het project "lokaliseerden" ze $_ via local binnen foreach, in de verwachting $_ voor iterators te vervangen, terwijl ze vergaten dat foreach al een nieuwe $_ instelt. Resultaat — niet-werkende filter en onjuiste iteratielogica.
Verhaal
De globale package variabele was niet gedeclareerd via our, en de poging tot lokalisatie via local $var leidde tot een crash van het script door strict en warnings, en de debugging nam een hele dag in beslag.