Geschichte des Themas:
Perl unterstützt dynamisches und statisches Laden von Code seit der Einführung von Modulen. Dafür bietet die Sprache drei verschiedene Mechanismen: require, use und do. Jeder von ihnen hat seine eigenen Besonderheiten, einen unterschiedlichen Lebenszyklus und Auswirkungen auf den Kontext der Programmausführung.
Problem:
Die falsche Auswahl des Lade-Mechanismus oder ein Missverständnis der Unterschiede zwischen ihnen führt häufig zu Bugs: Mehrfaches Laden von Modulen, Probleme mit Sichtbarkeiten, Laufzeitfehler (z. B. fehlgeschlagenes Laden, nicht initialisierte Variablen oder Funktionen).
Lösung:
use — lädt ein Modul zur Compile-Zeit. Ruft automatisch die Methode import auf, wenn sie definiert ist. Wird für das Laden von Modulen und die Deklarationen zu Beginn des Programms verwendet.require — lädt eine Datei oder ein Modul zur Laufzeit, nur einmal pro Programm. Geeignet für das dynamische Laden von Dateien basierend auf Bedingungen.do — führt die Datei einfach als Perl-Code aus, jedes Mal beim Aufruf. Wird selten verwendet, benötigt für spezielle Fälle (z. B. Konfigurationsdateien).Beispiel-Code:
use Some::Module; # statisches Laden if ($config{plugin}) { require "$config{plugin}.pm"; # dynamisches Laden } do 'local_config.pl'; # führt jedes Mal beim Start aus
Wichtige Eigenschaften:
use funktioniert nur mit package/module, ruft import auf, wirkt zur Compile-Zeit.require funktioniert mit Dateien und Modulen, wird zur Laufzeit ausgeführt.do cached das Modul nicht, sondern führt einfach den Inhalt der Datei aus.Kann man require für die Verbindung mit einer Variablen und einem Modul wie Some::Module verwenden?
Ja, aber der Pfad zur Datei muss explizit angegeben oder der Modulname in den Pfad umgewandelt werden:
my $mod = 'Some::Module'; $mod =~ s!::!/!g; require "$mod.pm"; # korrekt
Was passiert, wenn do die Datei nicht finden kann?
do gibt false (undef) zurück und speichert den Fehler in $@ — es löst keine Panik aus, wie use/require.
Was passiert, wenn require zweimal auf die gleiche Datei aufgerufen wird?
require lädt die Datei nur beim ersten Mal, nachfolgende Aufrufe werden das Laden nicht wiederholen, selbst wenn die ursprüngliche Datei geändert wurde.
Im Projekt wurde versucht, Plugins zur Laufzeit mit do zu laden, ohne den zurückgegebenen Status zu überprüfen, und man verwechselte es mit require.
Vorteile:
Nachteile:
require wurde zur bedingten Ladeverwendung genutzt, und der Modulname wurde immer in einen Pfad umgewandelt. $@ wurde nach dem Ladeversuch überprüft.
Vorteile:
Nachteile: