Achtergrond:
In Perl zijn zowel globale als lokale variabelen vanaf het begin actief gebruikt. Later werden lexicale variabelen geïntroduceerd met behulp van het sleutelwoord my. Dit gaf ontwikkelaars handige hulpmiddelen om de scope van variabelen te controleren en naamconflicten te voorkomen.
Probleem:
Fouten ontstaan vaak door verwarring tussen globale (package variables) en lexicale variabelen, verkeerd gebruik van local en my, en ook door het tijdelijk vervangen van globale waarden tijdens de uitvoering van de code. In grote projecten kan onnauwkeurige controle over scopes leiden tot moeilijk te traceren fouten.
Oplossing:
Gebruik my om variabelen met lexicale scope te declareren (scoped binnen het blok waar ze zijn gedefinieerd), en gebruik globale variabelen alleen indien nodig. Voor het tijdelijk vervangen van de waarde van een globale variabele gebruik je local, wat de oorspronkelijke waarde behoudt tot het einde van het blok. Voor package-variabelen gebruik je our. Een goed begrip van deze verschillen helpt om bijwerkingen te vermijden.
Code voorbeeld:
our $global = 10; sub demo { my $lexical = 20; local $global = 99; # tijdelijke wijziging van global print "Binnen demo: $global, $lexical "; } demo(); print "Buiten demo: $global ";
Belangrijke kenmerken:
my creëert variabelen die alleen zichtbaar zijn binnen de huidige bloklocal wijzigt tijdelijk globale variabelenour declareert package-variabelen voor gebruik buiten het huidige bestandKan een variabele die via my is gedeclareerd buiten het huidige blok beschikbaar zijn?
Nee. Een lexicale variabele my is alleen zichtbaar binnen het blok waar het is aangemaakt; daarbuiten bestaat het niet.
Wat is het verschil tussen local en our?
local wijzigt tijdelijk de waarde van een globale variabele voor de duur van het blok, terwijl our wordt gebruikt om een variabele te declareren die zichtbaar is in het hele pakket, zonder dat er kopieën van de waarde worden gemaakt.
Code voorbeeld:
our $var = 1; # globale package-variabele sub test { local $var = 3; # vervangt tijdelijk $var door 3 print $var; }
Kun je my gebruiken binnen eval, zodat de variabele zichtbaar wordt buiten eval?
Nee. De scope van variabelen die binnen eval via my zijn gedeclareerd, is beperkt tot dat eval-blok.
my en local, onbegrip van de werking van deze sleutelwoordenNegatief geval
In een groot Perl-project werden overal globale variabelen gebruikt zonder expliciete scopes (zonder my en our). Op een dag overschreef een nieuwe ontwikkelaar per ongeluk een van deze variabelen in een module, wat leidde tot onvoorspelbare resultaten in productie.
Voordelen:
Nadelen:
Positief geval
In een nieuw project werden alle variabelen gedeclareerd via my binnen functies en blokken, en globale variabelen alleen via our indien nodig, met duidelijke documentatie.
Voordelen:
Nadelen: