Historie der Frage:
In Perl ist der Namensraum die Hauptmethode zur Isolierung von Variablen und Funktionen zwischen verschiedenen Teilen des Programms. Mit der Direktive package werden unabhängige Bereiche geschaffen, von denen jeder sein eigenes Set an globalen Variablen und Funktionen erhält. Dies ermöglicht die Entwicklung von mehrteiligen Projekten ohne Namenskonflikte.
Problem:
Falscher Umgang mit dem Geltungsbereich (scoping), Vermischung von lexikalischen und package-Variablen oder falscher Umgang mit dem "main" Namensraum führt oft zu Problemen: unerwartete Variablen, Überschreibung von Funktionen, nicht offensichtliche Bugs in Steuern und Tests.
Lösung:
package SomeName;.my) sind nur innerhalb des Blocks sichtbar, während globale (our, früher use vars) im gesamten Paket sichtbar sind.AnotherPackage::some_function().Beispielcode:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
Wesentliche Merkmale:
:: angegeben, um auf fremde Ressourcen zuzugreifen.main ist der standardmäßige globale Namensraum für Skripte.Was ist der Unterschied zwischen my, our und local in Paketen?
my — ist immer nur im aktuellen lexikalischen Block.our — deklariert eine globale Paketvariable, macht sie jedoch als lexikalischen Verweis im Block verfügbar.local — überschreibt vorübergehend den globalen Wert einer Paketvariable so lange der Block existiert.Kann man eine Funktion ohne explizite Angabe des Pakets aufrufen?
Ja, wenn die Funktion mit Hilfe des Moduls Exporter und use in das aktuelle Paket exportiert wird, ansonsten nur über den vollständigen Namen.
Kann man mehrere Packages in einer Datei deklarieren?
Ja, aber es ist schwierig zu verstehen — nach jedem package beziehen sich alle weiteren Deklarationen auf einen neuen Namensraum. Es ist besser, separate Dateien für jedes Paket zu verwenden.
In einem Skript für das Team wurden mehrere Packages hintereinander in einer Datei verwendet; die Variablen vermischten sich, manchmal lexikalisch, manchmal global.
Vorteile:
Nachteile:
Jedes Package wurde in sein eigenes Modul ausgegliedert, die Funktionen wurden explizit exportiert.
Vorteile:
Nachteile: