In Perl gibt es kein klassisches System von Zugriffsmodifikatoren wie public/private/protected. Die Steuerung des Zugriffs auf Funktionen und Daten erfolgt durch Konventionen und den Gültigkeitsbereich von Variablen.
my (lexikalische Sichtbarkeit innerhalb der Datei oder des Blocks) verwendet und die Symbolexporte (über Exporter oder eigene Mechanismen).@EXPORT, @EXPORT_OK), bleiben standardmäßig "intern" für das Modul, obwohl sie bei Bedarf immer explizit mit dem Paketpräfix aufgerufen werden können._internal_sub), was eine Konvention für die Privatsphäre darstellt.Beispiel:
package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # Von außen nicht zugänglich sub public_func { _internal_func(); } sub _internal_func { print "Das ist intern! "; } 1;
Welche Maßnahmen schützen die private Funktion des Perl-Moduls vor dem Aufruf von außen? Kann man sie nicht direkt aufrufen?
Antwort: Tatsächlich können alle Unterprogramme eines Pakets explizit mit dem vollständigen Namen aufgerufen werden: MyLib::_internal_func(). Perl beschränkt diesen Aufruf nicht technisch — der Schutz erfolgt nur auf der Ebene der Konvention.
Geschichte
Ein Entwickler exportierte zu viele Funktionen aus dem Modul und vergaß die Einschränkung über
@EXPORT_OK. Letztendlich erhielten die Benutzer versehentlich Zugriff auf interne Funktionen, was zu Namenskonflikten und falscher API-Nutzung führte.
Geschichte
In einem großen Projekt verwendeten zwei Teams dieselbe interne Methode (beginnend mit _), glaubend, dass sie privat ist. Später änderten sie die Schnittstelle der Funktion, was die Aufrufe aus einem anderen Teil des Systems brach.
Geschichte
In einem der Projekte modifizierten sie das Modul eines externen Entwicklers, indem sie dessen nicht-exportierte Methoden direkt aufriefen. Nach der Aktualisierung des Verteilers hörte das Modul auf zu funktionieren, da sich die internen Funktionsnamen geändert hatten, was zum Absturz der Anwendung führte.