<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<link rel="SHORTCUT ICON" href="../bilder//pl.ico">
<title>Module </title>
</head>
<body bgcolor="#ffffff">
<hr>
<h1 align="center">Module</h1>
<table align="center"><tr>
<td><a href="perl_perl.html"> <img src="../bilder//perl_links.gif" alt="[ vorherige Seite ]" width="43" height="30" border="0"></a></td>
<td><a href="../perl-tutorial.html"> <img src="../bilder//perl_titel.gif" alt="[ Titelseite ]" width="81" height="22" border="0"></a></td>
<td><a href="perl_inhalt.html"> <img src="../bilder//perl_inhalt.gif" alt="[ Inhalt ]" width="57" height="22" border="0"></a></td>
<td><a href="perl_index.html"> <img src="../bilder//perl_index.gif" alt="[ Index ]" width="54" height="22" border="0"></a></td>
<td><a href="perl_lokal.html"> <img src="../bilder//perl_rechts.gif" alt="[ nächste Seite ]" width="43" height="30" border="0"></a></td>
</tr></table>
<hr>
<ul>
<li><a href="#abs1">Packages</a></li>
<li><a href="#abs2">Module</a></li>
<li><a href="#abs3">Exportieren von Namen</a></li>
<li><a href="#abs4">Standardmodule</a></li>
</ul>
<a name="abs1"></a><hr>
<h2 align="center">Packages</h2>
<hr>
<p>
In einem Unterprogramm können mit Hilfe von
<code>local()</code> oder <code>my()</code> lokale
Variablen definiert werden, die dann nur einen entsprechend
eingeschränkten Gültigkeitsbereich besitzen.
Etwas ähnliches gilt auch für Variablen, die
außerhalb von Subroutinen (im "Hauptprogramm")
verwendet werden: Sie sind eigentlich nicht wirklich globale
Variablen, sondern gelten nur innerhalb eines sogenannten
Packages. Wird kein solches Package deklariert, nimmt Perl das
Standardpackage "main" an.
</p>
<p>
Tritt bei der Programmausführung eine
<code>package</code>-Anweisung auf, so gilt ab dort der Namensraum
des entsprechenden Packages mit eigenen Variablen. Das heißt,
jede Variable ist an ein bestimmtes Package gebunden. Wichtige Ausnahmen
hiervon sind Variablen, die mit <code>my</code> deklariert werden,
sowie spezielle Variablen wie <code>$_</code> oder <code>@ARGV</code>.
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>$v = 123;<br>print $v."\n"; <font color="#006600"># (1)</font><br><br><font color="#006600">### Ab hier gilt ein neuer Namensraum.</font><br><font color="#0000cc">package p;</font><br>print $v."\n"; <font color="#006600"># (2)</font><br>print $main::v."\n"; <font color="#006600"># (3)</font><br>print $::v."\n"; <font color="#006600"># (4)</font><br>$w = 456;<br>print $w."\n"; <font color="#006600"># (5)</font><br>print $p::w."\n"; <font color="#006600"># (6)</font><br><br><font color="#006600">### Hier kehren wir wieder zu "main" zurück.</font><br><font color="#0000cc">package main;</font><br>print $v."\n"; <font color="#006600"># (7)</font><br>print $w."\n"; <font color="#006600"># (8)</font><br>print $p::w."\n"; <font color="#006600"># (9)</font><br></code></td></tr></table>
</td></tr></table>
<p>
Anmerkungen hierzu:
</p>
<blockquote>
<table border="0" cellpadding="5">
<tr>
<td VALIGN="top"><b>(1)</b></td>
<td>Gibt wie gewohnt den Inhalt von <code>$v</code> aus ("123").</td>
</tr>
<tr>
<td VALIGN="top"><b>(2)</b></td>
<td>Dies führt zu einer Fehlermeldung, da <code>$v</code>
in "main" angelegt wurde, und daher im Package "p" nicht bekannt ist.</td>
</tr>
<tr>
<td VALIGN="top"><b>(3)</b></td>
<td>So kann über den Package-Namen auch in "p" auf
<code>$v</code> zugegriffen werden.</td>
</tr>
<tr>
<td VALIGN="top"><b>(4)</b></td>
<td>Für main-Variablen kann der explizite Package-Name
auch weggelassen werden.</td>
</tr>
<tr>
<td VALIGN="top"><b>(5)</b></td>
<td>Gibt den Inhalt der Variablen <code>$w</code> aus (zum Package
"p" gehörend!).</td>
</tr>
<tr>
<td VALIGN="top"><b>(6)</b></td>
<td>Wie (5), nur mit Package-Namen</td>
</tr>
<tr>
<td VALIGN="top"><b>(7)</b></td>
<td>Da hier wieder der Namensraum von "main" gilt, gibt es diesmal
keine Fehlermeldung (vgl. (2)).</td>
</tr>
<tr>
<td VALIGN="top"><b>(8)</b></td>
<td>Da <code>$w</code> in "p" angelegt wurde, darf sie nicht
ohne weiteres in "main" verwendet werden, d.h., hier erfolgt
eine Fehlermeldung.</td>
</tr>
<tr>
<td VALIGN="top"><b>(9)</b></td>
<td>So kann in "main" auf Variablen eines anderen Packages
zugegriffen werden.</td>
</tr>
</table>
</blockquote>
<p>
Die Zeilen (3), (4), (6) und (9) zeigen, wie man eine (skalare) Variable
vollständig beschreibt:
</p>
<blockquote>
<blockquote>
<code>$</code><i>Package-Name</i><code>::</code><i>Variablenname</i>
</blockquote>
</blockquote>
<p>
Man beachte, daß das Dollarzeichen dabei ganz vorne steht (und nicht
etwa unmittelbar vor dem Variablennamen).
</p>
<p>
Wie schon weiter oben erwähnt, sind <code>my</code>-Variablen nicht an
ein Package gebunden, daher wird bei folgendem Beispiel keine
Fehlermeldung ausgegeben:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br><font color="#0000cc">my</font> $v = 123;<br>print $v."\n";<br><br>package p;<br>print $v."\n";<br></code></td></tr></table>
</td></tr></table>
<p align="right"><a href="perl_modul.html">[Seitenanfang]</a></p>
<a name="abs2"></a><hr>
<h2 align="center">Module</h2>
<hr>
<p>
In Perl wird ein Package, das in einer eigenen Datei abgelegt wird,
und üblicherweise von anderen Programmen mittels
<code>use</code>
eingebunden wird, als Modul bezeichnet. Dabei ist der Dateiname
gleich dem Package-Namen, ergänzt um die Endung "<code>.pm</code>".
Wie schon bereits beim <a href="perl_perl.html">Einbinden von
Perl-Code</a> beschrieben, muß der Rückgabewert beim
Importieren von Code aus einem Modul <i>wahr</i> sein, daher die
Zeile "<code>1;</code>" am Ende.
</p>
<p>
Ein Modul in der Datei <b><tt>hallo.pm</tt></b> könnte beispielweise
so aussehen:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>package hallo;<br><br>sub sag_hallo {<br> print "Hallo, Welt!\n";<br>}<br><br>1;<br></code></td></tr></table>
</td></tr></table>
<p>
Es kann dann in einem Perl-Programm so verwendet werden:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><font color="#0000cc">use hallo;</font><br><br>&<font color="#0000cc">hallo::</font>sag_hallo();<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>Hallo, Welt!<br></code></td></tr></table>
</td></tr></table>
<p>
Da die Subroutine <code>sag_hallo</code> in einem eigenen Package
definiert wird (nämlich "hallo"), muß beim Aufruf des
Unterprogramms auch der Package-Name mit angegeben werden.
</p>
<p align="right"><a href="perl_modul.html">[Seitenanfang]</a></p>
<a name="abs3"></a><hr>
<h2 align="center">Exportieren von Namen</h2>
<hr>
<p>
Damit beim Einbinden eines Moduls nicht bei jedem Aufruf einer Funktion
der Package-Name mit angegeben werden muß, kann man Namen
(skalare Variablen, Arrays, Subroutinen,...) aus einem
Modul heraus exportieren. Jene Variablen werden dann beim
Aufruf von <code>use</code>
ins Hauptprogramm importiert, d.h., sie können dann dort
so verwendet werden, als wären sie im Hauptprogramm
deklariert worden.
</p>
<p>
Dazu gibt es ein Modul namens "Exporter", das
diese Aufgabe übernimmt. Es definiert zum einen einige
Arrays, die dem Exportieren von Namen dienen. Die beiden
wichtigsten sind <code>@EXPORT</code>
und <code>@EXPORT_OK</code>.
Außerdem wird die bei der Beschreibung von
<code>use</code> erwähnte
Routine <code>import()</code> definiert. Da sich die Routine
<code>import()</code> nicht im Modul selbst befindet (sondern in
"Exporter"), muß man den Perl-Interpreter durch das
<code>@ISA</code>-Array darauf hinweisen:
</p>
<blockquote>
<code>
@ISA = ( 'Exporter' );
</code> </blockquote>
<p>
Genauer gesagt wird damit das aktuelle Modul wie eine von
<code>Exporter</code> abgeleitete Klasse
im Sinne objektorientierter Programmierung betrachtet, worauf hier aber
nicht weiter eingegangen werden soll.
</p>
<p>
Alle Namen in <code>@EXPORT</code>
werden automatisch in das aufrufende Programm exportiert, während
diejenigen Namen, die in <code>@EXPORT_OK</code> stehen, nur auf Verlangen
exportiert werden. Namen, die sich nicht in einem der beiden genannten
Arrays befinden, können nur zusammen mit dem Package-Namen
verwendet werden.
</p>
<p>
Beispiel eines Moduls in der Datei <b><tt>modul.pm</tt></b>:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>package modul;<br><br><font color="#0000cc">use Exporter;</font><br><font color="#0000cc">@ISA = ('Exporter');</font><br><br><font color="#0000cc">@EXPORT</font> = ( 'routine_1' );<br><font color="#0000cc">@EXPORT_OK</font> = ( 'routine_2' );<br><br>sub routine_1 { print "Routine Nr.1\n" }<br>sub routine_2 { print "Routine Nr.2\n" }<br>sub routine_3 { print "Routine Nr.3\n" }<br><br>1;<br></code></td></tr></table>
</td></tr></table>
<p>
So werden nur die Namen aus <code>@EXPORT</code> importiert,
alle anderen benötigen den Package-Namen:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><font color="#0000cc">use modul;</font><br><br>routine_1();<br>&modul::routine_2();<br>&modul::routine_3();<br></code></td></tr></table>
</td></tr></table>
<p>
Hier werden die Namen aus <code>@EXPORT_OK</code>
explizit importiert:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><font color="#0000cc">use modul 'routine_2';</font><br><br>&modul::routine_1();<br>routine_2();<br>&modul::routine_3();<br></code></td></tr></table>
</td></tr></table>
<p>
So importiert man beide exportierten Funktionen, <code>routine_3</code>
kann allerdings nicht importiert werden:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><font color="#0000cc">use modul 'routine_1','routine_2';</font><br><br>routine_1();<br>routine_2();<br>&modul::routine_3();<br></code></td></tr></table>
</td></tr></table>
<p>
Weitere Informationen enthält die Manual Page von "Exporter", die
beispielsweise durch "<code>perldoc Exporter</code>"
ausgegeben wird.
</p>
<p align="right"><a href="perl_modul.html">[Seitenanfang]</a></p>
<a name="abs4"></a><hr>
<h2 align="center">Standardmodule</h2>
<hr>
<p>
Bei der Perl-Distribution wird schon eine Reihe von Modulen
mitgeliefert, wie beispielsweise das oben erwähnte Modul
"Exporter". Um herauszufinden, welche Module wo installiert sind,
betrachte man das Array <code>@INC</code>, das eine Liste
von Pfaden enthält, in denen Perl bei Bedarf nach Modulen
sucht.
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>foreach my $pfad ( <font color="#0000cc">@INC</font> ) {<br> print "$pfad\n";<br>}<br></code></td></tr></table>
</td></tr></table>
<p>
Die Dokumentation eines Moduls erhält man (zumindest bei einem
gut geschriebenen Modul) durch den Aufruf von "<code>perldoc</code>"
mit dem Namen der Moduldatei als Argument.
</p>
<p>
Es lohnt sich auf jeden Fall, einen Blick in die Bibliothek
der Standardmodule zu werfen, da sie viele Funktionen bereitstellen,
die oft benötigt werden, wie das Lesen von Kommandozeilenoptionen,
das Arbeiten mit Dateibäumen, das Kopieren von Dateien und
vieles mehr.
</p>
<p>
Eine große Sammlung weiterer Module für die verschiedensten
Aufgaben findet sich im
<a href="perl_internet.html#abs3"><i>Comprehensive Perl Archive Network</i>
(CPAN)</a>.
</p>
<p align="right"><a href="perl_modul.html">[Seitenanfang]</a></p>
<hr>
<table align="center"><tr>
<td><a href="perl_perl.html"> <img src="../bilder//perl_links.gif" alt="[ vorherige Seite ]" width="43" height="30" border="0"></a></td>
<td><a href="../perl-tutorial.html"> <img src="../bilder//perl_titel.gif" alt="[ Titelseite ]" width="81" height="22" border="0"></a></td>
<td><a href="perl_inhalt.html"> <img src="../bilder//perl_inhalt.gif" alt="[ Inhalt ]" width="57" height="22" border="0"></a></td>
<td><a href="perl_index.html"> <img src="../bilder//perl_index.gif" alt="[ Index ]" width="54" height="22" border="0"></a></td>
<td><a href="perl_lokal.html"> <img src="../bilder//perl_rechts.gif" alt="[ nächste Seite ]" width="43" height="30" border="0"></a></td>
</tr></table>
<hr>
<table width="100%"><tr>
<td align="left"><i>Autor:
<a href="mailto:Eike.Grote@web.de">Eike Grote</a></i>
</td>
<td align="right"><i>Version: 2.05 (24.1.2012)</i>
</td>
</tr></table>
</body>
</html>