In Perl bestaat er geen klassieke systeem van access-modifiers zoals public/private/protected. Alle toegang tot functies en gegevens wordt beheerd via afspraken en de scope van variabelen.
my gebruikt (lexicale zichtbaarheid binnen een bestand of blok) en het exporteren van symbolen (via Exporter of eigen mechanismen).@EXPORT, @EXPORT_OK), blijven standaard "intern" voor de module, hoewel ze altijd expliciet kunnen worden aangeroepen met de naam van het pakket als prefix._internal_sub), wat een afspraak over privacy vertegenwoordigt.Voorbeeld:
package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # Niet toegankelijk van buitenaf sub public_func { _internal_func(); } sub _internal_func { print "Dit is intern! "; } 1;
Welke maatregelen beschermen de privéfunctie van een Perl-module tegen externe aanroepen? Kan men haar niet direct aanroepen?
Antwoord: Eigenlijk kunnen alle subroutines van het pakket expliciet worden aangeroepen met de volledige naam: MyLib::_internal_func(). Perl beperkt deze aanroep technisch niet - de bescherming is alleen op het niveau van afspraak.
Verhaal
Een ontwikkelaar exporteerde te veel functies uit de module, waarbij hij de beperking via
@EXPORT_OKvergat. Hierdoor kregen gebruikers per ongeluk toegang tot interne functies, wat leidde tot naamconflicten en onjuist gebruik van de API.
Verhaal
In een groot project gebruikten twee teams dezelfde interne methode (beginnend met _), denkend dat deze privé was. Later wijzigden ze de interface van de functie, wat de aanroepen uit een ander deel van het systeem verbrak.
Verhaal
In een van de projecten werd een module van een externe ontwikkelaar gemodificeerd door direct zijn niet-geëxporteerde methoden aan te roepen. Na het bijwerken van de distributie stopte de module met werken, omdat de interne functionele namen waren veranderd, wat resulteerde in een crash van de applicatie.