Subroutinen
Wie jede gute Programmiersprache können in Perl eigene Funktionen programmiert
werden. Man nennt sie in Perl Subroutinen
(wie in Fortran!?).
Sie können irgendwo im Programm platziert werden. Normalerweise wird
man sie an den Anfang oder ans Ende des Programmes stellen.
Beispiel:
sub mysubroutine {
print "Dies ist eine langweilige Subroutine.\n";
print "Sie macht immer das gleiche!\n';
}
Alle folgenden Anweisungen rufen diese Subroutine auf. Beachte den Buchstaben
& vor dem Namen. Ab Version 5 ist dies für Subroutinen-Aufrufe
nicht mehr nötig. Wir merken uns aber & als Typbezeichner
für Subroutinen.
&mysubroutine; # Aufruf ohne Parameter
&mysubroutine($_); # Aufruf mit einem Parameter
&mysubroutine(1+2, $_); # Aufruf mit zwei Parametern
Wie in C kann eine Subroutine deklariert und später definiert werden.
sub NAME; # Deklaration
sub NAME(PROTO); # Deklaration mit Prototypen
sub NAME BLOCK # Definition
sub NAME(PROTO) BLOCK # Definition mit Prototypen
Im Allgemeinen gelten folgende Regeln für den Unterprogrammaufruf:
NAME(LIST); # & ist fakultativ mit Klammern
NAME LIST; # Klammern sind fakultativ falls vordefiniert oder importiert
&NAME; # übergibt der Subroutine aktuellen @_
Parameter
Im Falle von mysubroutine wurden die Parameter akzeptiert aber
nicht verwendet. Mit dem Aufruf einer Subroutine werden alle übergebenen
Parameter im Spezialarray @_ gespeichert. Diese Variable hat nichts
zu tun mit der Spezialvariablen $_. @_ ist ein Array, $_
ist eine skalare Variable. Die folgende Subroutine gibt die Liste der
Parameter aus, mit welcher sie aufgerufen wurde:
sub printargs {
print "@_\n";
}
printargs("perly", "king"); # Example prints "perly king"
printargs("frog", "and", "toad"); # Prints "frog and toad"
Wie bei jedem anderen Array, können die einzelnen Elemente von @_ mit eckigen
Klammern zugegriffen werden:
sub printfirsttwo {
print "Der erste Parameter war $_[0]\n";
print "und $_[1] war der zweite\n";
}
Wir betonen noch einmal das $_[0] und $_[1] nichts zu tun haben mit der
Spezialvariablen $_ und das beides gleichzeitig benützt werden darf, ohne
Namenskollisionen befürchten zu müssen.
Rückgabewerte
Das Resultat einer Subroutine ist immer das Resultat des letzten evaluierten
Ausdruckes. Diese Subroutine berechnet das Maximum von zwei gegebenen Eingabeparameter:
sub maximum {
if ($_[0] > $_[1]) {
$_[0];
} else {
$_[1];
}
}
Der Aufruf sieht so aus:
$biggest = maximum(37, 24); # $biggest ist 37
Die Subroutine printfirsttwo gibt ebenfalls einen Wert zurück, und zwar ist es
1. Die letzte Evaluation dieser Subroutine war die print-Anweisung. Das Resultat
einer erfolgreichen print-Anweisung ist immer 1.
Lokale Variablen mit my
Die Variable @_ ist lokal zur aktuellen Subroutine. Um Namenskollisionen
zu vermeiden, können auch andere Variablen lokal gemacht werden. Dazu
verwenden wir die Funktionen my
oder local.
Häufig möchte man die Elemente von @_ einer eigenen lokalen Variablen
zuordnen, etwa um die Lesbarkeit zu verbessern. Die folgende Subroutine testet, ob ein
String Substring eines anderen ist, ohne die Leerzeichen zu berücksichtigen:
sub inside {
my ($a, $b); # Erzeuge lokale Var.
($a, $b) = ($_[0], $_[1]); # Param. zuordnen
$a =~ s/ //g; # Leerzeichen aus lok.
$b =~ s/ //g; # Var. löschen
($a =~ /$b/ || $b =~ /$a/); # Ist $b in $a
# oder $a in $b?
}
inside("lemon", "dole money"); # true
Falls mehr als eine Variable mit my deklariert werden soll, müssen sie in
Klammern angegeben werden (my ist eine Funktion!). Wir können das Ganze auch noch
ein wenig eleganter schreiben, indem wir die ersten beiden Zeilen zusammenfassen:
my ($a, $b) = @_;
Lokale Variablen mit local
local
war in Perl 4 die einzige Möglichkeit lokale Variabeln zu deklarieren.
Aus Kompatibilitätsgründen und für Spezialfälle ist es noch verfügbar.
my ist
die neuere (abPerl 5) und effizientere Art lokale Variablen zu deklarieren.
Der Unterschied zu local liegt in wichtigen Feinheiten. local
erzeugt einen temporären Wert für eine globale Variable, wohingegen my
eine echte lokale Variable deklariert, welche nur im umgebenden Block,
Subroutine (oder eval) bekannt
ist. Die Syntax ist bei beiden gleich.
Eine Einschränkung gibt es bei den Variablennamen: Mit my sind
nur alphanumerische Zeichen erlaubt! Um Spezialvariablen, wie zB. $\ zu
lokalisieren, muss local verwendet werden.
Uebung
Mache aus der FOR-Schleife der letzten Uebung eine Subroutine mit zwei Parametern. Der
erste ist der Suchstring, der zweite der Array aus den Teilstücken des Textes. Innerhalb
der Subroutine sollen alle Variablen lokal sein (mit my). Rufe diese Subroutine im
Hauptprogramm auf.
 
|