SELFHTML

Funktionen f�r Module und Packages

Informationsseite

nach unten Allgemeines zu diesen Funktionen
nach unten package - Namensraum eines Packages aktivieren
nach unten require - andere Perl-Datei ausf�hren
nach unten use - Modul einbinden

 nach unten 

Allgemeines zu diesen Funktionen

Um die hier beschriebenen Funktionen besser zu verstehen, sollten Sie das Kapitel �ber Kapitel Perl-Module lesen.

@INC - die Liste der Pfadnamen f�r Module

Wenn Sie mit nach unten require oder nach unten use eine Moduldatei (Dateien *.pm) einbinden, sucht Perl die entsprechende Datei entweder im aktuellen Verzeichnis, oder in einem Verzeichnis, das in der Liste f�r Modulpfadnamen gespeichert ist. Dazu dient die Seite vordefinierte Variable @INC. Im Abschnitt Seite Speicherorte f�r Module und die Liste @INC finden Sie ein Beispielscript, mit dessen Hilfe Sie sich den Inhalt von @INC ausgeben lassen k�nnen, um die bei Ihnen g�ltigen Pfade herauszufinden.

Neben der Liste @INC gibt es �brigens auch einen Hash namens %INC. In diesem Hash werden alle bereits geladenen Module gespeichert. Perl verhindert auf diese Weise, dass Module mehrfach geladen werden und dadurch zu unerw�nschtem Verhalten im Programmablauf f�hren. �ber derartige Probleme, die in C durch Pr�prozessoranweisungen wie #ifndef und #define gel�st werden m�ssen, brauchen Sie sich in Perl also keine Gedanken machen.

Namensr�ume

Ein Namensraum hei�t in Perl Package. Wenn Sie nichts anderes angeben, befindet sich jede Perl-Datei im package mit dem Namen main. Variablen, die innerhalb einer Perl-Datei ohne weitere Einschr�nkungen wie Seite local oder Seite my definiert werden, Namen von Subroutinen usw. gelten global in dieser einen Datei. Mit Hilfe der Funktion nach unten package k�nnen Sie eine Perl-Datei in mehrere Packages unterteilen.

Was ist besser - require oder use?

Die beiden Funktionen nach unten require und nach unten use haben �hnliche Aufgaben, unterscheiden sich jedoch in ihrer Wirkungsweise. require wird zur Laufzeit eines Scripts geladen (und zwar an der Stelle, wo die require-Anweisung steht), w�hrend use bereits vorher, zur Kompilierzeit des Scripts, mit eingebunden wird. Bei require wechseln Sie also einfach w�hrend der Scriptausf�hrung in ein anderes Script, lassen dieses kompilieren und ausf�hren, und kehren dann zur�ck. Bei use dagegen haben Sie nach dem Kompilieren, das Perl vor jedem Ausf�hren des Scripts durchf�hrt, praktisch ein gro�es Script, dessen Code sich aus den Sourcen mehrerer Moduldateien zusammensetzt. Das hat Folgen. So werden Syntaxfehler, die in einem mit use eingebundenen Modul enthalten sind, bereits im Vorfeld erkannt, und das Script wird gar nicht erst ausgef�hrt. Bei require hingegen kann es passieren, dass das Hauptscript fehlerfrei ist, das eingebundene Script jedoch Syntaxfehler enth�lt. Diese werden jedoch erst erkannt, wenn das Hauptscript bereits l�uft. Dadurch k�nnen undefinierte Zust�nde entstehen. Aus heutiger Sicht ist die Verwendung von use in den meisten F�llen vorzuziehen. Allerdings gibt es auch Ausnahmen.

Letztlich ist die Tatsache, dass es heute beide Funktionen gibt, historisch bedingt. require ist �lter (wurde schon von Perl 4 interpretiert), w�hrend use seit Version 5 zur Verf�gung steht. In der 5er-Version wurde das Modulkonzept von Perl stark erweitert und hat erst dort die heute verbreitete Form angenommen.

nach obennach unten

package - Namensraum eines Packages aktivieren

Mit dieser Funktion bestimmen Sie einen nach oben Namensraum als den aktiv g�ltigen. Der Namensraum bleibt solange aktiv, bis mit einem neuen Aufruf von package ein anderer Namensraum aktiv wird, oder bis die nat�rliche Grenze eines Namensraums, also der aktuelle Block (etwa eine Subroutine) oder das Dateiende erreicht ist. Auf diese Weise k�nnen Sie innerhalb einer Scriptdatei modular arbeiten.

Erwartet als Parameter:
1. den Namen des Namensraums, oder eine Zahl, die als Versionsnummer interpretiert wird.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

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

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Testausgabe</title>\n";
print "</head><body>\n";

package deutsch;
use vars qw($Hauptstadt $Flaeche);
$Hauptstadt = "Berlin";
$Flaeche = "356.910 qm";

package franzoesisch;
use vars qw($Hauptstadt $Flaeche);
$Hauptstadt = "Paris";
$Flaeche = "551.500 qm";

package deutsch;
print "<p>Die Hauptstadt ist $Hauptstadt und das Land ist $Flaeche gross</p>";

package franzoesisch;
print "<p>Die Hauptstadt ist $Hauptstadt und das Land ist $Flaeche gross</p>";

print "</body></html>\n";

Erl�uterung:

Das Beispiel ruft insgesamt vier mal package auf. Beim ersten mal wird dabei ein neuer Namensraum namens deutsch geschaffen, beim zweiten mal ein neuer Namensraum namens franzoesisch. Beim dritten mal wird der Namensraum deutsch erneut aufgerufen, und ab diesem Befehl kennt das Script nur diejenigen Variablen, Subroutinen usw., die innerhalb des gleichen Namensraums definiert wurden. Ebenso ist es beim vierten mal, wo der Namensraum franzoesisch wieder aufgerufen wird.

Bei Verwendung von use strict wie im Beispiel m�ssen die Variablen, die in den beiden ersten Package-Bl�cken deklariert werden, allerdings explizit global deklariert werden, um bei sp�teren Aufrufen des Packages zur Verf�gung zu stehen. Um die Deklaration globaler Variablen zu erm�glichen, steht das Seite Standardmodul vars zur Verf�gung. Im Beispiel sehen Sie, wie dieses Modul eingesetzt wird. Innerhalb eines Packages mit use eingebunden, stehen in der Klammer hinter qw alle Variablennamen des aktuellen Packages, die global, also ohne my davor deklariert werden sollen. Perl meckert dann trotz use strict nicht an den Deklarationen.

Beachten Sie

Solange nicht mit package ein spezieller Namensraum aktiviert wird, gilt der Default-Namensraum von Perl, der den Namen main hat.

nach obennach unten

require - andere Perl-Datei ausf�hren

Mit dieser Funktion f�hren Sie eine beliebige andere Perl-Datei aus. Das andere Script wird an der Stelle, an der der require-Aufruf steht, ausgef�hrt.

Erwartet als Parameter:
1. den Namen der einzubindenden Datei, gegebenenfalls mit Pfadnamen (Normalfall), oder eine Zahl, die als Versionsnummer interpretiert wird.

Beispiel - Teil 1 (vollst�ndiges CGI-Script in Perl):

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

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Testausgabe</title>\n";
print "</head><body>\n";

require "hallo_welt.pl";

print "</body></html>\n";

Beispiel - Teil 2 (Moduldatei hallo_welt.pl):

print "Hallo Welt!";
1;

Erl�uterung:

Das Beispiel zeigt, wie Sie ein "herk�mmliches" Perl-Script, das seinen Output auf die Standardausgabe schreibt, in ein CGI-Script einbetten k�nnen, sodass der Output an den aufrufenden Browser gesendet werden kann. Im GGI-Script wird mit require "hallo_welt.pl" eine andere Perl-Datei eingebunden. Diese Datei schreibt einfach ein Hallo Welt auf die Standardausgabe. Da es jedoch in ein Script eingebunden ist, das zuvor den �blichen HTTP-Header sendet, gelangt der Output als HTML-Inhalt zum Browser.

Beachten Sie

Sie k�nnen mit require ebenso wie mit nach unten use eine Moduldatei mit der Endung .pm einbinden. In diesem Fall m�ssen Sie require Modulname angeben. Perl sucht dann nach einer Datei namens Modulname.pm. Auch die Syntax mit :: ist genauso m�glich wie bei use (vergleiche dazu den Abschnitt Seite Adressierungs-Syntax beim Einbinden von Modulen).

Eingebundene Perl-Dateien m�ssen am Ende so etwas wie 1; enthalten. Dadurch wird sichergestellt, dass das Modul oder die Modul-Funktion korrekt ausgef�hrt wird.

Wenn eine eingebundene Datei Subroutinen enth�lt, k�nnen Sie diese so aufrufen, als w�ren sie im aktuellen Perl-Script notiert.

nach obennach unten

use - Modul einbinden

Mit dieser Funktion laden Sie ein Perl-Modul oder bestimmte Funktionen aus einem solchen Modul in ihr Script und k�nnen den entsprechenden Perl-Code in Ihrem Script benutzen.

Erwartet als Parameter:
1. den Namen des Moduls (Normalfall), oder eine Zahl, die als Versionsnummer interpretiert wird.
2. bis n. (optional) weitere, einschr�nkende Angaben (siehe weiter unten).

Beispiel - Teil 1 (vollst�ndiges CGI-Script in Perl):

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

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Testausgabe</title>\n";
print "</head><body>\n";

use Syntax;
my $Output = html_syntax("<h1>So sieht es aus</h1>","red");
print "<h1>So sieht es aus</h1>\n";
print "$Output\n";

print "</body></html>\n";

Beispiel - Teil 2 (Moduldatei Syntax.pm):

package Syntax;
use strict;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(html_syntax);
$VERSION = 1.0;

sub html_syntax {
  my $htmlstr = shift;
  my $color = shift;
  $htmlstr =~ s/\&/&amp;/g;
  $htmlstr =~ s/\"/&quot;/g;
  $htmlstr =~ s/\</&lt;/g;
  $htmlstr =~ s/\>/&gt;/g;
  $htmlstr =~ s/(&lt;)/<span style=\"color:$color\">$1/g;
  $htmlstr =~ s/(&gt;)/$1<\/span>/g;
  return($htmlstr);
}
1;

Erl�uterung:

Das Komplettbeispiel zeigt ein CGI-Script, in dem ein selbst definiertes Modul verwendet wird, sowie den Code der entsprechenden Moduldatei. Im CGI-Script wird die Moduldatei, die im Beispiel Syntax.pm hei�t und im gleichen Verzeichnis wie das CGI-Script oder im Hauptverzeichnis von @INC abgelegt wird, mit use Syntax; eingebunden (vergleichen Sie dazu den Abschnitt Seite Adressierungs-Syntax beim Einbinden von Modulen).

Das Hauptprogramm ruft dann eine Subroutine namens html_syntax() auf und �bergibt ihr zwei Parameter, n�mlich eine Zeichenkette mit HTML-Code und den Namen einer Farbe (red). Die Subroutine html_syntax() hat die Aufgabe, den �bergebenen HTML-Code HTML-gerecht zu maskieren und die HTML-Tags in der angegebenen Farbe auszuzeichnen (also praktisch aus dem �bergebenen HTML-Code den Code mit HTML-Syntax-Highlighting darstellbar zu machen). Die Subroutine erzeugt dabei neuen HTML-Code und gibt diesen am Ende zur�ck. Im Hauptprogramm wird der zur�ckgegebene Code in der Variablen $Output aufgefangen. Deren Inhalt kann schlie�lich an den Webserver zur Weitergabe an einen aufrufenden Browser ausgeliefert werden.

Die Subroutine html_syntax() ist im Modul Syntax mit sub html_syntax definiert. Die Moduldatei enth�lt zu Beginn noch einige weitere Anweisungen, auf die an dieser Stelle nicht n�her eingegangen wird. Lesen Sie dazu den Abschnitt Seite Erweiterte Verwendung von use (@EXPORT, @EXPORT_OK und qw).

Die folgende Tabelle zeigt, welche Varianten es gibt, um mit use ein Modul oder bestimmte Teile davon einzubinden:

Beispiel: Erl�uterung:
use Beispiel; Bindet ein Modul namens Beispiel.pm ein, wobei diese Datei entweder im aktuellen Arbeitsverzeichnis oder in einem der Verzeichnisse abgelegt werden muss, die in nach oben @INC gespeichert sind. Geben Sie also den Dateinamen ohne die Endung an. Die Endung der Moduldatei muss .pm lauten.
use Beispiel::Spezial; Bindet ein Modul namens Spezial.pm ein. Dabei l�st Perl die ::-Syntax als Pfadnamen auf - d.h. es wird eine Datei mit dem Pfadnamen Beispiel/Spezial.pm erwartet. Dies ist ein relativer Pfadname, ausgehend von einem der Verzeichnispfade, die in nach oben @INC gespeichert sind.
use CGI::Carp qw(fatalsToBrowser); Bindet aus dem Verzeichnis CGI das Modul Carp.pm ein. Das Symbol fatalsToBrowser wird der Importliste �bergeben. Normalerweise wird es dann in den aktuellen Namensraum importiert, was allerdings - typisch f�r Perl - gerade bei diesem popul�ren Beispiel nicht der Fall ist. Die �bergabe von fatalsToBrowser l�st hier eine Sonderbehandlung aus.
use 5.003; Script l�uft nur weiter, wenn ein Perl-Interpreter installiert ist, der eine Versionsnummer gleich oder h�her als 5.003 hat.

Beachten Sie

Die Anweisung:
use Modulname;
ist gleichbedeutend mit:
BEGIN { require Modulname; import Modulname [Importliste]; }
Die Funktion use leistet also die Summe aus dem, was die Funktion nach oben require in Verbindung mit der Methode import leistet.

Wenn Sie use genau ein Argument �bergeben und dieses Argument eine Zahl ist, also z.B. 5 oder 5.003, dann pr�ft Perl diese Angabe gegen die Versionsnummer des Perl-Interpreters. Ist die Versionsnummer des Perl-Interpreters niedriger als die angegebene Zahl, wird das laufende Script sofort mit einer Fehlermeldung beendet. Dies kann sinnvoll sein, um zu verhindern, dass ein Script weiterl�uft, das Code enth�lt, der h�here Perl-Versionen erfordert.

Module m�ssen am Ende so etwas wie 1; enthalten. Dadurch wird sichergestellt, dass das Modul korrekt eingebunden wird.

 nach oben
weiter Seite Einf�hrung in das Arbeiten mit Modulen
zur�ck Seite Funktionen f�r Informationen aus Konfigurationsdateien
 

© 2007 Seite Impressum