Zur Organisation von Code in Perl verwendet man Module (packages), die in separaten Dateien mit der Endung .pm abgelegt werden.
use (in der Kompilierungsphase) und require (in der Ausführungsphase).@INC — das ist eine Liste von Verzeichnissen, in denen Perl nach Modulen sucht.Beispiel für ein Modul:
Foo.pm
package Foo; use strict; use warnings; sub say_hello { print "Hello from Foo! "; } 1;
Einbinden und Benutzen:
use lib '.'; # Fügt das aktuelle Verzeichnis zu @INC hinzu use Foo; Foo::say_hello(); # Gibt aus: Hello from Foo!
Wesentliche Unterschiede:
use importiert das Modul zu Beginn der Skriptausführung und ruft automatisch die Methode import auf, wenn vorhanden.require lädt das Modul nur beim ersten Aufruf.Was ist der Unterschied zwischen use und require? Wann verwendet man welchen Operator?
Antwort:
use— wirkt in der Kompilierungsphase, ruft automatischimportauf (wird normalerweise für Module verwendet).require— wirkt zur Laufzeit, ist notwendig, wenn der Name des Moduls bis zur Ausführung unbekannt ist oder es nicht immer eingebunden werden muss.
Geschichte
In einem großen Projekt wurde eine eigene Bibliothek über
requireeingebunden, ohne daran zu denken, dass sie exportierte Funktionen verwendet. Die verwendete Funktion wurde nicht exportiert, darequireimportnicht aufruft. Das Ergebnis — der Import von Symbolen funktioniert nicht, man muss die Funktionen explizit aufrufen.
Geschichte
Beim Verschieben des Moduls in einen eigenen Ordner wurde vergessen, den Pfad zum Ordner über
use libhinzuzufügen oder die Variable@INCzu ändern. Das Modul konnte nicht gefunden werden, das Skript endete mit einem Fehler, obwohl die Datei am richtigen Ort im Projekt lag.
Geschichte
In einer alten Anwendung wurde das Modul mit einem Kleinbuchstaben benannt, aber mit einem Großbuchstaben über use eingebunden:
use foo;anstelle vonuse Foo;. Perl fand das Modul nicht, was die Funktionstüchtigkeit kritischer Teile der Anwendung beeinträchtigte.