Geschiedenis van de vraag:
In Perl is de naamruimte de belangrijkste manier om variabelen en functies tussen verschillende delen van het programma te isoleren. Met de package directive worden onafhankelijke gebieden gecreëerd, elk met zijn eigen set globale variabelen en functies. Dit maakt het mogelijk om projecten met meerdere bestanden te ontwikkelen zonder naamconflicten.
Probleem:
Onjuiste omgang met scope, vermenging van lexicale en pakketvariabelen, of onjuiste omgang met de "main" naamruimte leidt vaak tot problemen: onverwachte variabelen, overschreven functies, onduidelijke bugs in belastingen en tests.
Oplossing:
package SomeName;.my) zijn alleen zichtbaar binnen het blok, terwijl globale (our, eerder use vars) zichtbaar zijn in het hele pakket.AnotherPackage::some_function().Voorbeeld code:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
Belangrijke kenmerken:
:: voor toegang tot externe bronnen.main is de standaard globale naamruimte voor scripts.Wat is het verschil tussen my, our en local in pakketten?
my — altijd alleen binnen het huidige lexicale blok.our — declareert een globale pakketvariabele, maar maakt deze beschikbaar als een lexicale verwijzing binnen het blok.local — overschrijft tijdelijk de globale waarde van de pakketvariabele gedurende de tijd dat het blok bestaat.Kun je een functie aanroepen zonder expliciet de package aan te geven?
Ja, als de functie in de huidige package wordt geëxporteerd met behulp van de Exporter-module en use, anders alleen via de volledige naam.
Kun je meerdere packages in één bestand declareren?
Ja, maar dit is moeilijk te begrijpen — na elke package verwijzen alle verdere declaraties naar een nieuwe naamruimte. Het is beter om aparte bestanden voor elke package te gebruiken.
In een scripts van het team werden meerdere packages direct achter elkaar in één bestand gebruikt; variabelen raakten door elkaar, soms lexicaal, soms globaal.
Voordelen:
Nadelen:
Elke package werd in zijn eigen aparte module geplaatst, functies werden expliciet geëxporteerd.
Voordelen:
Nadelen: