Unterprogramme und Perl-Funktionen
Unterprogramme
Unterprogramme mit Parameterübergaben und Rückgabewert
Lokale Variablen
Perl-Funktionen
Bei komplexeren Perl-Scripts ist es empfehlenswert, bestimmte Programmteile in selbst definierte Unterprogramme zu verlagern. Auf diese Weise können Sie das Script besser strukturieren. Sinnvoll ist das vor allem bei Programmteilen, die im Laufe des Scripts mehrmals ausgeführt werden. Bevor Sie also eine größere Prozedur mehrmals im Script notieren, sollten Sie die entsprechende Prozedur in ein Unterprogramm stecken und dieses Unterprogramm an der gewünschten Stelle aufrufen.
Beispiel:
#!/usr/bin/perl
$Ergebnis = 1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9;
&Ausgabe;
$Ergebnis = sqrt(sqrt(81));
&Ausgabe;
sub Ausgabe
{
print "Das Ergebnis lautet: ", $Ergebnis, "\n";
}
|
Erläuterung:
Ein Unterprogramm definieren Sie mit dem Schlüsselwort sub. Dahinter folgt ein frei wählbarer Name, der den Namenskonventionen von Perl entsprechen muß. Im obigen Beispiel wird auf diese Weise ein Unterprogramm sub Ausgabe definiert. Der gesamte Inhalt des Unterprogramms muß in geschweiften Klammern stehen. Sie können beliebige und beliebig viele Anweisungen innerhalb des Unterprogramms notieren.
Mit einem kaufmännischen Und-Zeichen & und anschließendem Unterprogrammnamen rufen Sie ein Unterprogramm auf. Der Aufruf ist eine eigene Anweisung, muß also wie andere Anweisungen mit einem Strichpunkt abgeschlossen werden. Im obigen Beispiel kommt zwei mal die Anweisung &Ausgabe; vor. Dadurch wird das Unterprogramm mit dem Namen Ausgabe aufgerufen.
Beachten Sie:
Es ist egal, an welcher Stelle innerhalb des Scripts ein Unterprogramm steht. Bei der Interpretation führt der Perl-Interpreter zuerst diejenigen Anweisungen der Reihe aus, die außerhalb der Unterprogramme stehen.
Die Unterprogramme werden beim Aufruf automatisch gesucht.
Sie können ein Unterprogramm aufrufen, das einen Wert ermittelt und diesen an die aufrufende Anweisung zurückgibt.
Beispiel:
#!/usr/bin/perl
$x = &Rechne(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9);
print $x, "\n";
sub Rechne
{
return eval($_[0]);
}
|
Erläuterung:
Im Gegensatz zu anderen Programmiersprachen wie etwa C oder auch Java und JavaScript brauchen Sie bei einem Unterprogramm, dem Parameter übergeben werden sollen, bei der Definition des Unterprogramms keine Parameterdeklarationen anzugeben. Im obigen Beispiel wird das Unterprogramm Rechne mit einem Parameter aufgerufen: (1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9). Das Unterprogramm Rechne verarbeitet diesen Parameter mit dem Konstrukt $_[0]. Dahinter steckt eine vordefinierte Variablen, nämlich die Liste @_. Es handelt sich um die Liste der übergebenen Parameter. $_[0] greift auf den ersten übergebenen Parameter zu, $_[1] auf den zweiten Parameter usw. Mit einer Anweisung wie for(@_) { print $_, "\n"; } können Sie beispielsweise auch alle übergebenen Parameter abarbeiten, ohne wissen zu müssen, wie viele Parameter übergeben wurden. So einfach ist das sonst in kaum einer Programmiersprache.
Der lange Rechenausdruck, der im obigen Beispiel an das Unterprogramm Rechne übergeben wird, ist ein einziger Parameter. Wenn Sie mehrere Parameter übergeben wollen, trennen Sie diese durch Kommata.
Um aus einem Unterprogramm einen Wert an eine aufrufende Anweisung zurückzugeben, benutzen Sie am besten die Perl-Funktion return. Dahinter können Sie z.B. eine Variable angeben, deren aktuellen Wert Sie zurückgeben wollen. Im obigen Beispiel gibt return direkt den Rückgabewert einer Perl-Funktion weiter, nämlich den Rückgabewert der Funktion eval(). Diese Funktion bewertet eine Zeichenkette als Rechenoperation und gibt das errechnete Ergebnis zurück.
Im obigen Beispiel wird der von Rechne zurückgegebene Wert in dem Skalar $x gespeichert. Dazu wird diesem Skalar einfach der Aufruf des Unterprogramms Rechne zugewiesen.
Im Gegensatz zu den meisten anderen Programmiersprachen behalten Variablen, die innerhalb eines Unterprogramms definiert werden, nach Beenden des Unterprogramms ihre Gültigkeit. Das bedeutet, daß Sie keine zwei gleichnamigen Variablen im gesamten Script definieren können. Denn sobald Sie mit der zweiten Variablen irgendetwas anstellen, verändern Sie einfach den aktuellen Inhalt der ersten, bereits vorhandenen. Diese Eigenschaft hat Perl den Ruf eingetragen, daß man damit nicht sauber strukturiert programmieren könne. Es gibt jedoch längst die Möglichkeit, die Lebensdauer einer Variablen innerhalb von Unterprogrammen auf das Unterprogramm zu beschränken.
Beispiel 1 (Variable behält ihren Wert):
#!/usr/bin/perl
&Rechne(3*12);
print $x, "\n";
sub Rechne
{
$x = eval($_[0]);
}
|
Beispiel 2 (Variable verliert ihren Wert):
#!/usr/bin/perl
&Rechne(3*12);
print $x, "\n";
sub Rechne
{
my $x = eval($_[0]);
}
|
Erläuterung:
In Beispiel 1 wird zuerst das Unterprogramm Rechne aufgerufen. Dort wird ein Skalar $x definiert, der den ersten übergebenen Parameter errechnet. Sonst tut das Unterprogramm nichts weiter. Im Hauptprogramm geht es anschließend damit weiter, daß der Inhalt von $x ausgegeben wird. Das funktioniert - $x hat seinen Wert nach Beenden des Unterprogramms Rechne also nicht verloren.
Beispiel 2 unterscheidet sich von Beispiel 1 nur durch ein einziges Wörtchen, nämlich das Wörtchen my vor der Definition von $x. Durch Voranstellen von my wird ein Skalar, eine Liste, ein Hash usw. innerhalb eines Unterprogramms als lokal definiert. Im obigen Beispiel 2 bleibt der im Hauptprogramm definierte Skalar $x leer, und es wird nichts ausgegeben.
Beachten Sie:
Ein weiteres Wort, um eine Variable als lokal zu markieren, ist local. Es hat die gleiche Bedeutung wie my, jedoch ist my verbreiteter.
Perl ist unter anderem deshalb so mächtig, weil der Perl-Interpreter etliche vordefinierte Unterprogramme - hier Perl-Funktionen genannt - kennt. Es gibt Perl-Funktionen für die unterschiedlichsten Aufgaben. Viele davon lernen Sie in den Abschnitten Dateien lesen und schreiben, Zeichenketten und Listen manipulieren und Mit Zahlen und Zeit arbeiten kennen.
Beispiel:
#!/usr/bin/perl
print "Geben Sie eine Reihe von Begriffen, getrennt durch Kommata, ein:\n";
$Eingabe = <STDIN>;
@Liste = split(/,/, $Eingabe);
@SortierteListe = sort(@Liste);
print "Danke! Und hier die Ausgabe der alphabetisch sortierten Begriffe:\n";
for(@SortierteListe)
{
if(/\n/)
{
chop($_);
}
print $_, "\n";
}
|
Erläuterung:
Die erste Perl-Funktion, die im obigen Beispiel vorkommt, ist print. Meistens werden Perl-Funktionen zwar wie in C oder deren Verwandten mit Klammern () aufgerufen, aber erforderlich ist das nicht. Bei so häufig benutzten Funktionen wie print ist das Verwenden der Klammer daher mittlerweile der Schreibfaulheit zum Opfer gefallen. Wenn Sie beispielsweise statt des Funktionsaufrufs sort(@Liste) (siehe obiges Beispiel) sort @Liste notieren, erkennt Perl das auch an.
Eine Perl-Funktion bekommt in der Regel Parameter übergeben, mit denen sie irgendetwas tut. So ist im Beispiel "Geben Sie eine Reihe von Begriffen, getrennt durch Kommata, ein:\n"; ein Parameter, der der print-Funktion übergeben wird. Weiter unten im Beispiel wird der Funktion sort als Parameter die Liste mit dem Namen @Liste übergeben. Wenn Sie einer Funktion mehrere Parameter übergeben, trennen Sie diese durch Kommata.
Perl-Funktionen haben in der Regel auch einen Rückgabewert. Im obigen Beispiel übernimmt etwa die Perl-Funktion sort die Sortierung der übergebenen Liste. Zurück gibt die Funktion eine neue Liste, nämlich mit den sortierten Elementen.
Zwei weitere Perl-Funktionen im obigen Beispiel sind split und chop.
Die split-Funktion kann in einer Zeichenkette nach Zeichen oder Zeichenketten suchen, die Sie mit Hilfe eines regulären Ausdrucks als Parameter übergeben. Außerdem muß noch die Zeichenkette oder der Skalar übergeben werden, der eine entsprechende Zeichenkette enthält. Dann liefert split eine Liste mit Elementen zurück, die durch die angegebene Trennregel voneinander getrennt wurden.
Die chop-Funktion beseitigt das letzte Zeichen einer Zeichenkette. Das ist häufig sinnvoll, da Zeichenketten in Perl oft automatisch ein Steuerzeichen für Zeilenumbruch (\n) angehängt bekommen.
© 1997 Stefan Münz, s.muenz@euromail.com