SELFHTML

Einf�hrung in das Arbeiten mit Modulen

Informationsseite

nach unten Allgemeines zu Modulen in Perl
nach unten Module einbinden mit require und use
nach unten Speicherorte f�r Module und die Liste @INC
nach unten Adressierungs-Syntax beim Einbinden von Modulen
nach unten Packages und Module
nach unten Erweiterte Verwendung von use (@EXPORT, @EXPORT_OK und qw)
nach unten Moduldokumentationen lesen mit perldoc

 nach unten 

Allgemeines zu Modulen in Perl

Beim Programmieren werden Sie schnell feststellen, dass Sie bestimmte Routine-Aufgaben immer wieder ben�tigen. Immer wieder m�ssen Dateien eingelesen werden, in einer CGI-Umgebung m�ssen immer wieder Formulare verarbeitet werden, zur Kommunikation mit fernen Rechnern im Internet muss immer wieder eine Internet-Socket-Verbindung aufgebaut werden usw. Nun bietet der Perl-Interpreter ja bereits eine Menge Kapitel Funktionen an, die solche Routine-Aufgaben bew�ltigen. Doch je mehr solcher Funktionen im Perl-Interpreter fest eingebaut sind, desto gr��er, langsamer und ressourcen-unfreundlicher wird der Interpreter. Daher gibt es einen zweiten Typ Funktionen, n�mlich solche, die nicht direkt in den Perl-Interpreter eingebaut sind, sondern in Form von Perl-Scripts zur Verf�gung stehen. Diese speziellen Perl-Scripts werden Module genannt. Module stellen Funktionen (aber auch Variablen) f�r bestimmte Routine-Aufgaben zur Verf�gung. Um in Ihren eigenen Perl-Scripts solche Funktionen verwenden zu k�nnen, binden Sie einfach die Module ein, in denen die gew�nschten Funktionen stehen. Anschlie�end k�nnen Sie auf die Funktionen und Variablen der Module zugreifen.

Mittlerweile gibt es tausende von Perl-Modulen, die frei verf�gbar sind. Es gibt praktisch kaum mehr ein Programmiergebiet, f�r das es nicht schon Module mit fertigen leistungsstarken Funktionen gibt. Die Module werden der Allgemeinheit von eifrigen und f�higen Perl-Programmierern im Internet zur Verf�gung gestellt. Einige dieser Module konkurrieren miteinander, und im Laufe der Zeit stellt sich heraus, dass eines der Module in der Praxis am tauglichsten ist. Nat�rlich gibt es auch Module, die h�ufiger zum Einsatz kommen als andere. Letzteres hat dazu gef�hrt, dass mittlerweile zwischen zwei wichtigen Klassen von �ffentlich verf�gbaren Modulen unterschieden wird: es gibt Standardmodule und CPAN-Module. Standardmodule sind solche, die zusammen mit dem Perl-Interpreter ausgeliefert werden, und CPAN-Module stehen im Internet zum Download zur Verf�gung. Standardmodule erhalten dadurch nat�rlich einen wesentlich h�heren Verbreitungsgrad. Da sie bei jeder typischen Installation des Perl-Interpreters mit installiert werden, k�nnen sie auch fast so bedenkenlos verwendet werden wie die fest eingebauten Funktionen von Perl. Denn auch wenn ein Perl-Script auf einen anderen Rechner portiert wird und dort seine Arbeit verrichten soll, stehen die gleichen Module zur Verf�gung - vorausgesetzt, eine entsprechend aktuelle Version des Perl-Interpreters ist installiert. Wenn Sie dagegen CPAN-Module downloaden und in Ihre eigenen Scripts einbinden, ist die Portierung eines Scripts auf einen anderen Rechner nicht ganz so unproblematisch. Denn das Script funktioniert dort erst, nachdem die gleichen CPAN-Module installiert sind.
Innerhalb dieses Kapitels finden Sie einen Abschnitt �ber die Seite Standardmodule von Perl und einen Abschnitt �ber Seite CPAN-Module. Dort erhalten Sie eine �bersicht, welche Module zur Verf�gung stehen.

Daneben ist es selbstverst�ndlich auch m�glich, eigene Module zu schreiben. F�r gr��ere Perl-Scripts ist es auch besser, den Code so zu verteilen, dass es nur noch ein schlankes Hauptscript mit eingebundenen Modulen f�r spezielle Aufgaben gibt. Angenommen, Sie programmieren ein Perl-Script, das eine Datei mit einer bestimmten Datenstruktur verarbeitet. Bei dieser Aufgabe k�nnten Sie ein Modul schreiben, das alle Funktionen zum Einlesen der Datei in geeignete Variablen und zum Zur�ckschreiben verarbeiteter Daten in die Datei enth�lt. Im Hauptscript k�nnen Sie dann einfach dieses Modul einbinden und auf dessen Funktionen und Variablen zugreifen. Sollte sich dann beispielsweise das Dateiformat der Datendatei �ndern, muss nur das Modul umgeschrieben werden, w�hrend das Hauptscript und m�gliche andere Module davon unber�hrt bleiben. Typische Beispiele zum Erstellen projekteigener Module finden Sie im Abschnitt �ber Seite objektorientierte Programmierung. Das ist kein Zufall. Denn modul-orientiertes Arbeiten im modernen Stil und objektorientiertes Programmieren geh�ren bei Perl eng zusammen.

Perl-Module sind also (meistens) selber Perl-Scripts. Es handelt sich jedoch um Scripts, bei denen ein paar Regeln und Besonderheiten zu beachten sind, auf die im folgenden noch n�her eingegangen wird.

nach obennach unten

Module einbinden mit require oder use

Zum Einbinden von Modulen stehen in Perl die Funktionen Seite use und Seite require zur Verf�gung. Im allgemeinen wird heute empfohlen, die Funktion use zu verwenden, weil sie konsequenter den Modul-Gedanken verfolgt. Bei Verwendung von use wird das Modul ganz zu Beginn des Hauptscripts eingebunden. Es steht also zur Verf�gung, bevor �berhaupt die erste Code-Zeile Ihres Scripts ausgef�hrt wird. Bei Verwendung von require wird die andere Datei dagegen erst an der Stelle eingebunden, an der die require-Anweisung steht. Vor dem entsprechenden Aufruf stehen also Funktionen oder Variablen des Moduls noch nicht zur Verf�gung, und falls der require-Aufruf beispielsweise in einem Zweig einer bedingten Anweisung steht, wird er nur dann ausgef�hrt, wenn das Script in den entsprechenden Zweig gelangt. Ein Beispiel soll dies verdeutlichen.

Beispiel - Teil 1: Moduldatei Testmodul.pm

#!/usr/bin/perl -w

print "Hier meldet sich das Modul \"Testmodul.pm\"\n";

1;

Beispiel - Teil 2a: Hauptscript test_require.pl

#!/usr/bin/perl -w

print "Hier meldet sich das Hauptscript\n";
require Testmodul;

Beispiel - Teil 2b: Hauptscript test_use.pl

#!/usr/bin/perl -w

print "Hier meldet sich das Hauptscript\n";
use Testmodul;

Erl�uterung:

Der erste Teil des Beispiels zeigt den Code der Datei Testmodul.pm. Die Beispielteile 2a und 2b zeigen jeweils ein Perl-Script, in dem diese Moduldatei eingebunden wird. Im Script test_require.pl (2a) wird das Modul mit require eingebunden, im Script test_use.pl (2b) dagegen mit use. Beide Scripts (2a und 2b) sind identisch bis auf den unterschiedlichen Funktionsaufruf. Das Ergebnis der Ausgabe ist jedoch verschieden. In 2a (also beim Einbinden des Moduls mit require lautet es:
Hier meldet sich das Hauptscript
Hier meldet sich das Modul "Testmodul.pm"

In 2b dagegen (Einbinden des Moduls mit use) lautet die Ausgabe dagegen:
Hier meldet sich das Modul "Testmodul.pm"
Hier meldet sich das Hauptscript

Der Grund ist, dass ein mit use eingebundenes Modul ausgef�hrt wird, bevor der Code des einbindenden Scripts ausgef�hrt wird. Bei require wird das eingebundene Script dagegen an der Stelle ausgef�hrt, an der es eingebunden wird.

Auf den ersten Blick spricht dieser Unterschied eher f�r die Verwendung von require und weniger f�r den von use. In der Praxis ist es jedoch so, dass Moduldateien meist keinen direkt auszuf�hrenden Code enthalten, sondern aus Funktionen (Subroutinen) bestehen, die dann im einbindenden Script aufgerufen werden k�nnen.

Beispiel - Teil 1: Moduldatei Testmodul.pm

#!/usr/bin/perl -w

sub Modulprint {
  print "Hier meldet sich das Modul \"Modul.pm\"\n";
}

1;

Beispiel - Teil 2a: Hauptscript test_require.pl

#!/usr/bin/perl -w

print "Hier meldet sich das Hauptscript\n";
require Testmodul;
Modulprint();

Beispiel - Teil 2b: Hauptscript test_use.pl

#!/usr/bin/perl -w

print "Hier meldet sich das Hauptscript\n";
use Testmodul;
Modulprint();

Erl�uterung:

In diesem Beispiel-Ensemble erzeugen die Scripts aus 2a und 2b die gleiche Ausgabe, n�mlich:
Hier meldet sich das Hauptscript
Hier meldet sich das Modul "Testmodul.pm"

Der Grund ist, dass der Code des Moduls nun in einer Subroutine namens Modulprint steht. In den einbindenden Scripts test_require.pl und test_use.pl wird mit der Anweisung Modulprint(); die entsprechende Funktion im eingebundenen Modul aufgerufen.

Beachten Sie:

Ein weiterer wichtiger Unterschied zwischen use und require ist, dass Sie bei use genau angeben k�nnen, welche Funktions- und Variablennamen Sie aus einem Modul importieren wollen, w�hrend require diese M�glichkeit nicht anbietet. Mehr dazu weiter unten im Abschnitt nach unten Erweiterte Verwendung von use.

nach obennach unten

Speicherorte f�r Module und die Liste @INC

Moduldateien k�nnen in einem der Verzeichnisse abgelegt werden, die in der Seite vordefinierten Variablen @INC definiert sind, oder in einem Unterverzeichnis davon. Bei einer typischen Perl-Installation enth�lt die Liste @INC eine Reihe von Unterverzeichnissen des Perl-Installationsverzeichnisses sowie das jeweils aktuelle Verzeichnis, also meistens das Verzeichnis, in dem das die Moduldatei einbindende Hauptscript liegt.

Das Ablegen von Moduldateien im Verzeichnis bzw. einem Unterverzeichnis des Hauptscripts ist dann sinnvoll, wenn die Moduldateien von keinem anderen Script verwendet werden. Wenn die Moduldateien dagegen so allgemein geschriebenen Code enthalten, dass Sie sie f�r verschiedene Scripts verwenden k�nnen, dann ist es besser, Sie legen die Moduldateien in einem der anderen Verzeichnisse ab, die in @INC genannt werden.

Um zu entscheiden, wo Sie Moduldateien ablegen k�nnen, m�ssen Sie also erst einmal die Liste der erlaubten Verzeichnisse kennen. Das folgende einfache Perl-Script hilft dabei.

Beispiel-Script zur Ausgabe von @INC (als CGI-Script):

Beispiel-Seite Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

#!/usr/bin/perl -w

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Erlaubte Modulverzeichnisse</title>\n";
print "</head><body>\n";
print "<h1>Verzeichnisse zum Ablegen von Moduldateien:</h1>\n";
foreach (@INC) {
 print "<tt>$_</tt><br>\n";
}
print "</body></html>\n";

Erl�uterung:

Das Script gibt einfach den Inhalt der Liste @INC zeilenweise als HTML-Code aus. Wenn Sie den Code als pl-Datei im CGI-Verzeichnis abspeichern und die pl-Datei von einem Browser anfordern lassen, werden die verf�gbaren Verzeichnispfade angezeigt. In der �blichen Konfiguration ist der letzte Eintrag der Liste ein einzelner Punkt (.). Dies steht f�r "aktuelles Verzeichnis" und bewirkt, dass der Perl-Interpreter, nachdem er eine eingebundene Datei in den allgemeinen Verzeichnispfaden nicht gefunden hat, im aktuellen Verzeichnis sucht.

Falls Sie Ihre Moduldatei in keinem der Verzeichnisse ablegen wollen, die von @INC angeboten werden, k�nnen Sie sie auch woanders ablegen. Dann m�ssen Sie allerdings vor dem Einbinden einer solchen Moduldatei die Liste @INC um den Verzeichnispfad erweitern, in dem die Moduldatei liegt.

Beispiel:

#!/usr/bin/perl -w

use lib "/httpd/docs/cgi-shared/speziell";
use lib "/httpd/docs/cgi-shared/module";

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Erlaubte Modulverzeichnisse</title>\n";
print "</head><body>\n";
print "<h1>Verzeichnisse zum Ablegen von Moduldateien:</h1>\n";
foreach (@INC) {
 print "<tt>$_</tt><br>\n";
}
print "</body></html>\n";

Erl�uterung:

Durch eine Anweisung vom Typ use lib mit anschlie�ender Angabe eines Verzeichnispfades wird dieser Pfad an den Anfang der Liste @INC �bernommen. Das Beispiel-Script ist das gleiche CGI-Script zur Ausgabe der Pfade von @INC wie zuvor. In diesem Fall zeigt es, dass die so definierten eigenen Pfade mit in die Liste aufgenommen wurden.

nach obennach unten

Adressierungs-Syntax beim Einbinden von Modulen

Module k�nnen in einem der Verzeichnisse von @INC oder einem Unterverzeichnis davon abgelegt werden. Daraus ergeben sich dann die m�glichen Formen der Adressierung eines Moduls beim Einbinden mit use oder require.

Beispiele f�r Module in einem @INC-Verzeichnis:

require "Statistik.pm";
require Statistik;
use "Statistik.pm";
use Statistik;

Erl�uterung:

Alle vier Beispiele zeigen das Einbinden eines Moduls, das in einer Datei namens Statistik.pm abgelegt ist. Die Datei befindet sich direkt in einem der Verzeichnisse, die in der Liste @INC als m�gliche nach oben Speicherorte f�r Module zur Verf�gung stehen. F�r require und use gelten die gleichen Regeln. Entweder notieren Sie den vollst�ndigen Dateinamen der Moduldatei in Anf�hrungszeichen (Moduldateien sollten die Endung .pm haben), oder Sie notieren den Dateinamen ohne die Endung .pm ohne Anf�hrungszeichen.

Wenn sich die Datei in einem Unterverzeichnis eines der Verzeichnisse von @INC befindet, ist die relative Pfadangabe erforderlich.

Beispiele f�r Module in Unterverzeichnissen eines @INC-Verzeichnisses:

require "Berechnungsmodule/Statistik.pm";
require Berechnungsmodule::Statistik;
use "Berechnungsmodule/Statistik.pm";
use Berechnungsmodule::Statistik;

Erl�uterung:

Wieder zeigen alle vier Beispiele das Einbinden eines Moduls Statistik.pm. Die Datei befindet sich unterhalb eines der @INC-Verzeichnisse in einem Unterverzeichnis namens Berechnungsmodule. In diesem Fall ist allerdings die Syntax ohne Anf�hrungszeichen vorzuziehen. Denn wenn Sie mit Anf�hrungszeichen arbeiten, m�ssen Sie die einzubindende Datei mit "vollem" Namen ansprechen. Die Syntax ohne Anf�hrungszeichen kommt dagegen ohne die Dateiendung .pm aus. Es wird erwartet, dass die eingebundene Moduldatei diese Endung hat. Die Zeichenfolge, die die Verzeichnistrenner symbolisiert, also Hierarchien darstellt, besteht aus einem doppelten Doppelpunkt (::).

nach obennach unten

Packages und Module

So einfach das Konzept der Module in Perl erst einmal klingt - es bringt doch ein paar Probleme mit sich. Angenommen, in Ihrem eigenen Perl-Script definieren Sie eine Subroutine namens get_data(). In dem gleichen Script binden Sie ein Modul ein, in dessen Code ebenfalls eine Subroutine namens get_data() definiert ist. Damit der Perl-Interpreter beim Aufruf von get_data() wei�, welche der beiden Funktionen gemeint ist, muss es eine M�glichkeit geben, ihm mitzuteilen, welche der Funktionen gemeint ist.

Zu diesem Zweck gibt es in Perl das Konzept der Namensr�ume. Jeder Namensraum stellt ein so genanntes Package (engl. f�r Paket) dar. Jedes Perl-Script, in dem Sie keine besondere Angabe machen, welchen Namensraum (welches Package) Sie meinen, benutzt ein Default-Package. Es hat den Namen main.

Beispiel:

#!/usr/bin/perl -w

$Ausgabetext = "Hallo alte Welt. ";
print $Ausgabetext;

package NeueWelt;
$Ausgabetext = "Hallo neue Welt. ";
print $Ausgabetext;

package main;
print $Ausgabetext;

Erl�uterung:

Das Beispiel verdeutlicht den Default-Namensraum mit dem Namen main. Zun�chst wird ein Seite Skalar namens $Ausgabetext definiert und mit einem Wert belegt. Dieser Wert wird gleich anschlie�end ausgegeben. Da bis zum Ausf�hrungszeitpunkt noch keine weitere Angabe zum Namensraum gemacht wurde, befindet sich das Script im Defaultnamensraum main. Im zweiten Schritt wird mit Hilfe der Funktion Seite package ein neuer eigener Namensraum mit Namen NeueWelt definiert. Unterhalb davon wird wiederum ein Skalar namens $Ausgabetext definiert, diesmal mit anderem Wert. Dieser neue Wert wird wieder ausgegeben.

Zu diesem Ausf�hrungszeitpunkt existieren nun zwei Skalare namens $Ausgabetext - n�mlich der aus dem Package NeueWelt und der aus dem Default-Package main. Zur Kontrolle wird im Beispiel wieder auf das Package main "umgeschaltet". Dazu wird wieder die Funktion package aufgerufen, diesmal aber mit dem Defaultnamen main. Von den beiden existierenden Skalaren dieses Namens wird nun der im Script zuerst definierte ausgegeben, also derjenige, der zum Default-Namensraum main geh�rt. Der unterste print-Aufruf gibt also wieder Hallo alte Welt. aus.

Wie das Beispiel zeigt, l�sst sich der Namensraum innerhalb einer Scriptdatei also beliebig wechseln. Dadurch l�sst sich ein hohes Ma� an Flexibilit�t erreichen. Von dieser Flexibilit�t profitieren die Module in Perl. Ein Modul kann n�mlich durch Anwendung der Package-Technik beispielsweise mehrere (Objekt-)Klassen in einer Moduldatei unterbringen oder andere Module (die ja auch aus Packages bestehen) erweitern, auch wenn die Technik zugegebenerma�en etwas unsauber ist. Ein einfaches Beispiel soll diesen Zusammenhang verdeutlichen.

Beispiel - Teil 1: Moduldatei Testmodul.pm

$Modultext = "Dies ist der Inhalt des Skalars \$Modultext\n";

package Testmodul;
$Text = "Dies ist der Inhalt des Skalars \$Text\n";

1;

Beispiel - Teil 2: Hauptscript, z.B. test.pl

#!/usr/bin/perl -w

use Testmodul;

print $Modultext;
print $Testmodul::Text;

Erl�uterung:

Der erste Teil des Beispiels ist das Modulscript, der zweite Teil das Hauptscript. Das Modulscript erh�lt im Beispiel den Namen Testmodul.pm und wird im Hauptscript mit der Anweisung use Testmodul; eingebunden.

Die Moduldatei beginnt mit der Definition eines Skalars namens $Modultext. Da zuvor kein anderes Seite package aufgerufen wird, ist das Package aktiv, in das das Modul eingebunden wird. Alles, was innerhalb dieses Namensraums definiert wird, befindet sich somit im Namensraum main des einbindenden Scripts. Im Beispiel gibt das einbindende Script, also das Hauptscript, mit print $Modultext; in seinem Default-Namensraum main einfach die Variable aus, die im Namensraum main der Moduldatei definiert wurde. $Modultext wurde also direkt im Default-Namensraum des einbindenden Scripts definiert. Damit wurde das Package main durch das Modul erweitert.

Im Modulscript, also in der Modul.pm, wird im weiteren Verlauf jedoch mit package ein neuer Namensraum definiert. Er hat den gleichen Namen wie der Vorname der Moduldatei, n�mlich Testmodul. Im einbindenden Hauptscript kann auf Variablen und Funktionen, die im Modul unterhalb des Packages Testmodul definiert werden, nur durch Angabe des entsprechenden Namensraums zugegriffen werden. Die Anweisung print $Testmodul::Text; zeigt, wie auf das andere Package zugegriffen wird. Dem Namen einer Variablen oder einer Funktion wird der Name des Packages und ein doppelter Doppelpunkt (::) vorangestellt. Skalare, Listen und Hashes beginnen weiterhin mit ihren typischen Kennzeichen $, @ und %. Zwischen dem Kennzeichen und dem Variablennamen steht jedoch der Package-Name und der doppelte Doppelpunkt.

Beachten Sie:

Das Ansprechen von Variablen oder Funktionen in anderen Packages oder Modulen mit Package-Name::Variablen/Funktionsname ist nicht m�glich, wenn die Variablen oder Funktionen mit Seite my deklariert sind. Die Anwendung von my wird deshalb auch in der Praxis empfohlen, um eine saubere Kapselung von Variablen und Funktionen, die nur innerhalb eines Packages oder Moduls von Bedeutung sind, zu erreichen.

nach obennach unten

Erweiterte Verwendung von use (@EXPORT, @EXPORT_OK und qw)

Da Module selbst wieder andere Module einbinden k�nnen und einzelne Module aber eigentlich Dateninseln darstellen sollen, st��t die Technik des Erweiterns von Packages irgendwann an ihre Grenzen. Um "�ffentliche" Schnittstellen von Modulen festlegen zu k�nnen, haben Sie die M�glichkeit, einzelne Symbole (also Variablennamen oder Funktionsnamen beispielsweise) in beiden Packages (also dem einbindenden und dem eingebundenen) sichtbar zu machen. Sie k�nnen die Symbole aus dem Modul exportieren bzw. in das einbindende Script oder Modul importieren.

Ein Modul kann deshalb erzwingen, dass Sie beim Einbinden genau angeben m�ssen, welche Variablen oder Funktionen Sie in den Namensraum des einbindenden Scripts importieren m�chten. Dazu gibt es das so genannte Exporter-Modul, ein Standardmodul von Perl. Dieses Modul erwartet im eingebundenen Package zwei Listen namens @EXPORT und @EXPORT_OK. Ein Modul kann das Exporter-Modul einbinden und diese beiden Listen mit denjenigen Variablen- und Funktionsnamen f�llen, die in ein einbindendes Modul �berhaupt exportiert werden k�nnen. Im einbindenden Script wiederum k�nnen Sie angeben, welche der exportierbaren Namen des Moduls Sie in den Namensraum Ihres Scripts importieren m�chten.

Beispiel - Teil 1: Moduldatei Testmodul.pm

package Testmodul;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(%FORMULARFELDER);
@EXPORT_OK = qw($Zeitstempel @Logdaten Besteller_ermitteln);

# hier folgt der Code des Moduls ...
# in dem Code kommen unter anderem vor:
# ein Hash namens %FORMULARFELDER
# ein Skalar namens $Zeitstempel
# eine Liste namens @Logdaten
# eine Funktion namens Besteller_ermitteln

1;

Beispiel - Teil 2: Hauptscript, z.B. test.pl

#!/usr/bin/perl -w

use Testmodul qw($Zeitstempel);

# hier folgt der Code des Scripts ...

Erl�uterung:

Die Moduldatei bindet im Beispiel mit Seite require selbst ein Modul ein, n�mlich das Standardmodul Exporter. Die Anweisung @ISA = qw(Exporter) definiert die Klasse Exporter als Basisklasse der aktuellen Klasse, die durch das aktuelle Package (im Beispiel also Testmodul) repr�sentiert wird. Damit wird die Methode import, die im Modul bzw. der Klasse Exporter definiert ist, an die Klasse Testmodul vererbt. Diese etwas kompliziert klingenden Erl�uterungen sind durch den Sprachgebrauch der objektorientierten Programmierung bedingt.

Die Liste @EXPORT kann Namen der Module aufnehmen, die in den Namensraum eines einbindenden Scripts standardm��ig exportiert werden, wenn bei der Einbindung keine spezielle Importliste angegeben ist. Die Liste @EXPORT_OK nimmt dagegen die Namen auf, die ein einbindendes Script maximal in den eigenen Namensraum �bernehmen kann, aber nicht �bernehmen muss.

Im obigen Beispiel ist in der Moduldatei bei der @EXPORT-Liste nur ein Name notiert, n�mlich ein Hash namens %FORMULARFELDER. Diese Variable wird in den Namensraum eines einbindenden Scripts exportiert, wenn bei der use-Anweisung keine Importliste angegeben wird. Bei der Liste @EXPORT_OK sind im Beispiel drei Namen notiert: ein Skalar namens $Zeitstempel, eine Liste namens @Logdaten und eine Subroutine namens Besteller_ermitteln.
Zur Notation der Listen bietet sich besonders der Operator qw an, da er es erm�glicht, die Variablennamen ohne st�ndige Anf�hrungszeichen notieren zu k�nnen. qw($Zeitstempel @Logdaten Besteller_ermitteln) entspricht eigentlich der Notation ('$Zeitstempel', '@Logdaten', 'Besteller_ermitteln'), ist aber �bersichtlicher.
Innerhalb der Klammern von qw werden die gew�nschten Namen notiert und durch Leerraumzeichen getrennt. Variablennamen erhalten dabei die �blichen Kennzeichen f�r Skalare, Listen und Hashes.

Das einbindende Script bindet das Modul im Beispiel mit use Testmodul ein und muss in der nachfolgenden Liste angeben, welche der bei @EXPORT oder EXPORT_OK genannten Namen es in den eigenen Namensraum importieren m�chte. Im Beispiel wird nur der Skalar $Zeitstempel angegeben und als einziger Name importiert. Wenn Sie die Listenangabe weglassen (im Beispiel also nur use Testmodul; notieren w�rden), werden die in @EXPORT aufgef�hrten Namen importiert.

nach obennach unten

Moduldokumentationen lesen mit perldoc

Module, die Sie nicht selbst geschrieben haben, aber in Ihre Scripts einbinden m�chten, m�ssen Sie nat�rlich so weit verstehen, dass Sie in der Lage sind, die darin enthaltenen Funktionen richtig aufzurufen, darin definierte Variablen zu kennen und zu benutzen usw. Deshalb sind zumindest alle wichtigen Seite Standardmodule und Seite Module aus dem CPAN-Verzeichnis dokumentiert. Da separate readme-Dateien aber leicht verloren gehen, stellt Perl die M�glichkeit bereit, die Dokumentation innerhalb der Datei mit dem Quellcode zu notieren. Zum Lieferumfang von Perl geh�rt das Programm perldoc, mit dem Sie den Dokumentationsteil am Bildschirm ausgeben k�nnen.

Das folgende Beispiel zeigt den vollst�ndigen Code eines kleinen Standardmoduls von Perl. Die Aufgabe des Moduls soll hier nicht weiter interessieren. Gezeigt werden soll, wie die Dokumentation in den Quellcode integriert ist.

Beispiel - die Moduldatei "Nox.pm"

package CPAN::Nox;
use strict;
use vars qw($VERSION @EXPORT);

BEGIN{
  $CPAN::Suppress_readline=1 unless defined $CPAN::term;
}

use base 'Exporter';
use CPAN;

$VERSION = "1.03";
$CPAN::META->has_inst('Digest::MD5','no');
$CPAN::META->has_inst('LWP','no');
$CPAN::META->has_inst('Compress::Zlib','no');
@EXPORT = @CPAN::EXPORT;

*AUTOLOAD = \&CPAN::AUTOLOAD;

1;

__END__

=head1 NAME

CPAN::Nox - Wrapper around CPAN.pm without using any XS module

=head1 SYNOPSIS

Interactive mode:

  perl -MCPAN::Nox -e shell;

=head1 DESCRIPTION

This package has the same functionality as CPAN.pm, but tries to
prevent the usage of compiled extensions during its own
execution. Its primary purpose is a rescue in case you upgraded perl
and broke binary compatibility somehow.

=head1  SEE ALSO

CPAN(3)

=cut

Erl�uterung:

Das Beispiel zeigt den Code des CPAN-Moduls Nox.pm. Der obere Teil der Moduldatei enth�lt den eigentlich ausf�hrbaren Code des Moduls, und der untere Teil enth�lt die Dokumentation zum Modul. Die Dokumentation beginnt mit Anweisungen, die in einer neuen Zeile beginnen und als erstes Zeichen ein Gleichheitszeichen (=) haben. Mit =head1 NAME wird beispielsweise eine �berschrift mit dem Titel NAME erzeugt. Alles, was danach kommt, wird bis zur beendenden Anweisung =cut als Dokumentation interpretiert.

Um die Dokumentation separat lesen zu k�nnen, m�ssen Sie auf der Kommandozeile Ihres Betriebssystems eingeben:
perldoc [Pfad]Modulname
Unter Windows k�nnen Sie die DOS-Eingabeaufforderung benutzen oder ein Programm, das in der Lage ist, Standard-Out-Ergebnisse eines Programms aufzufangen (manche besseren Texteditoren k�nnen das beispielsweise). Auf Unix-Systemen benutzen Sie einfach eine geeignete Shell. Wenn Sie den Pfad zu einer Moduldatei mit angeben, k�nnen Sie die Verzeichnisse mit einem Schr�gstrich (/) trennen. Oder Sie wechseln in das Verzeichnis der Moduldatei. Dann k�nnen Sie die Pfadangabe weglassen.
Im obigen Beispiel der Moduldatei Nox.pm sind Aufrufe m�glich wie:
perldoc CPAN::Nox
perldoc Nox.pm
perldoc Nox
perldoc -m Nox (listet den Quellcode mit auf)

 nach oben
weiter Seite Standardmodule von Perl
zur�ck Seite Funktionen f�r Module und Packages
 

© 2007 Seite Impressum