Funktionen auslagern

Funktionen können in Perl ausgelagert werden. D.h., sie werden in einer seperaten Datei gespeichert. In ein Perl-Script werden sie eingebunden durch require datei_name.extension

Voraussetzung dafür ist, daß sich die Datei in Verzeichnissen befindet, die in einem Array namens @INC enthalten sind. In @INC befindet sich insbesondere das aktuelle Verzeichnis sowie unter Linux z.B. /usr/lib/perl5/5.6.0 u.a.m.
@INC ist die Suchpfadliste für Funktionsbibliotheken (zunächst einmal).

@INC ist erweiterbar.

Die Funktionen können im Script verwendet werden, als wären sie direkt im Script definiert worden. Der Speicherbereich des Scripts1 ohne require wurde expandiert um den Speicherbedarf der Funktionen. Der Vorteil liegt also nicht in effizienterer Speicherverwaltung, sondern lediglich in der Übersichtlichkeit des Quelltextes und der Möglichkeit, Funktionsbibliotheken in mehreren Scripten gleichzeitig zu nutzen


Zwischenbemerkung

Nicht nur Funktionen können in Funktionsbibliotheken abgelegt werden. Auch Variablen, global wie lokal (mit my $var) können dort definiert werden. Lokal definierte Variablen können nicht über require in ein Script importiert werden. Funktionen können in Perl nicht lokal definiert werden, im Gegensatz zu Java (private) .
Allerdings kann in der Funktionsbibliothek auf diese Variablen Bezug genommen werden.


Wie wäre es nun, wenn man nicht den gesamten Speicherbereich der Funktionsbibliothek in das Script kopiert (denn nichts anderes passiert durch require), sondern lediglich die Speicheradressen der Funktionen und Variablen dem Script übergibt ? Vordergründig gibt man die Mehrfachnutzung wieder preis, da dann nicht mehrere Scripten zugleich die Lib nutzen können. Jedoch kann man es dem Script überlassen, welche Funktionen und damit Speicherbereiche in das Script zur Laufzeit hineinkopiert werden.

Welche Funktionalitäten müssen dafür zur Verfügung gestellt werden ?

  1. Die Funktionsbibliothek stellt eine Liste der Adressen ihrer Funktionen und Variablen zur Verfügung.
  2. Das Script nimmt die Liste entgegen und allokiert sich bei Bedarf für die mit den Adressen verknüpften Elemente der Lib Speicherbedarf und kopiert die Struktur dort hinein.

Zu 1 : Welche Speicherstruktur kommt in Frage ? Geleistet werden muß die unmittelbare Zuordnung einer Speicheradresse zu einem Funktionsnamen (allgemeiner : zu einem Elementnamen). Das leistet ein Hash. Dieser Hash braucht keinen Namen, wenn ich der Lib einen Namen gebe, über die ich sie ansprechen kann. Also ein anonymer Hash, der über eine Funktion (bless) mit dem Namen der Lib verknüpft wird. Die Namensgebung (Objektbezeichnung) muß daher innerhalb der erweiterten Lib erfolgen und erfolgt durch package name in der Lib, die jetzt als Modul bezeichnet wird. (Perl : Modul, Java : Klasse, zuweilen synonym verwendet)

Nun muß dieser dem packagename verknüpfte anonyme Hash noch einem Script zur Verfügung gestellt werden. Als Schnittstelle dient eine Funktion (new)

Daraus entsteht folgender Aufbau eines Perl-Moduls :

package my_modul
sub new {
          bless {};
}

sub func1 { ... }
sub func2 { ... }

1 : Das ist natürlich nicht exakt gesprochen, denn Speicherbereich wird erst zur Laufzeit allokiert, da Perl eine interpretierte Sprache ist.