In Perl kunnen variabelen lexicale of dynamische scoping hebben.
my creëert een variabele met lexicale scoping: de variabele is alleen zichtbaar binnen het blok waar het is gedefinieerd.local overschrijft tijdelijk de waarde van een globale (package) variabele met dynamische scoping: de nieuwe waarde is zichtbaar in alle aangeroepen functies tot het verlaten van het blok.our definieert een globale (package) variabele, maar zichtbaar alleen in het huidige lexicale blok.Voorbeeld:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Zal 10 afdrukken — my $x is niet zichtbaar vanuit inner $| = 1; test_loc(); # Zal 30 afdrukken — local $x is zichtbaar vanuit inner
local wordt gebruikt voor het wijzigen van package-variabelen zoals $_, $/, $@ en anderen.
Wat is het resultaat van het uitvoeren van de volgende code en waarom?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
Antwoord: Zal 5 afdrukken. Omdat de my-variabele $a van outer niet zichtbaar is vanuit inner; de package-variabele $a, gedefinieerd met our, wordt gebruikt.
Verhaal
Verhaal
Verhaal
In de JavaScript-ontwikkeling probeerden ontwikkelaars na de overstap naar Perl uit gewoonte overal variabelen met our te declareren zonder noodzaak, wat leidde tot onverwachte globale variabelen die de encapsulatie verstoorden en naamconflicten veroorzaakten.