Unterprogramme
Einführung
Unterprogramme (auch als "Funktionen"
oder "Subroutinen" bezeichnet)
dienen dazu, Programmteile, die
an mehreren Stellen (nahezu) identisch verwendet werden, durch
einen einzelnen Aufruf zu ersetzen, was oft die
Übersichtlichkeit erheblich verbessert. In Perl werden sie durch
das Schlüsselwort sub
eingeleitet. Der Aufruf eines
Unterprogramms erfolgt durch das Voranstellen eines "&
"
vor den Namen. Werden Klammern für Parameter (eventuell leer)
verwendet, kann auf das "&
" verzichtet werden.
Beispiel:
#!/usr/local/bin/perl -w
use strict;
print "Hier ist das Hauptprogramm.\n"; &UNTER; UNTER();
sub UNTER { print "Hier ist das Unterprogramm.\n"; }
|
|
Hier ist das Hauptprogramm. Hier ist das Unterprogramm. Hier ist das Unterprogramm.
|
|
Steht der Aufruf des Unterprogramms weiter hinten im Skript als die
Definition oder ein eventuell vorhandener Prototyp, kann auch der
Name alleine benutzt werden. Ein Prototyp besteht lediglich aus dem
Schlüsselwort sub
gefolgt vom Namen der Subroutine;
die Definition wird sozusagen später nachgeliefert.
#!/usr/local/bin/perl -w
use strict;
sub UNTER; # Prototyp
print "Hauptprogramm\n"; UNTER; # Name allein genügt
sub UNTER { # Definition print "Unterprogramm\n"; }
|
|
Die Definition des Unterprogramms kann (im Gegensatz zu manch anderen
Programmiersprachen) an einer beliebigen Stelle im Quelltext stehen.
[Seitenanfang]
Lokale Variablen
In einem Unterprogramm kann beliebig auf die (globalen) Variablen
des Hauptprogramms zugegriffen werden. Um Variablen lokal zu
definieren gibt es die Operatoren local
und my
.
Sie unterscheiden sich in bezug auf Unterprogramme darin, daß
Variablen, die in my
deklariert werden, nur dort im
Unterprogramm definiert sind (genauer: innnerhalb des Blockes, in
dem sie deklariert werden). Auf "local
"-Variablen dagegen
kann auch in weiteren Unterprogrammen zugegriffen werden, deren Aufruf innerhalb
des Unterprogramms erfolgt, in dem die Variablen deklariert werden.
Beispiel (der Übersichtlichkeit halber wird hier auf
use strict
verzichtet):
#!/usr/local/bin/perl -w
$gl = 1; $loc = 2; $my = 3;
print "main: \$gl = $gl, \$loc = $loc, \$my = $my\n"; sub1(); print "main: \$gl = $gl, \$loc = $loc, \$my = $my\n";
sub sub1 { local $loc = 7; my $my = 8;
print "sub1: \$gl = $gl, \$loc = $loc, \$my = $my\n"; sub2(); }
sub sub2 { print "sub2: \$gl = $gl, \$loc = $loc, \$my = $my\n"; }
|
|
main: $gl = 1, $loc = 2, $my = 3 sub1: $gl = 1, $loc = 7, $my = 8 sub2: $gl = 1, $loc = 7, $my = 3 main: $gl = 1, $loc = 2, $my = 3
|
|
Wie man sieht, ist $gl
überall unverändert
verfügbar, während $loc
in sub1
durch
eine neue Variable gleichen Namens ersetzt wird. Deren Wirkung erstreckt
sich aber bis in das zweite Unterprogramm. Dagegen ist die Zuweisung
$my = 8
nur in sub1
von Bedeutung. An der
letzten Ausgabezeile erkennt man, daß die Werte der globalen
Variablen von den lokalen Variablen gleichen Namens nicht beeinflußt
werden.
Eine genauere Beschreibung der Wirkungsweise der Operatoren
my()
und local()
findet sich unter
Variablen und Symboltabellen.
[Seitenanfang]
Parameter
Die Übergabe von Parametern erfolgt durch das spezielle
Array "@_
". Somit kann innerhalb des Unterprogramms
auf die (im Prinzip beliebig vielen) Parameter über
$_[0]
, $_[1]
, $_[2]
,...
zugegriffen werden.
Beispiel:
#!/usr/local/bin/perl -w
use strict;
&S(1,2); &S("aaa","bbb","ccc","ddd");
sub S { my $i;
for($i = 0;$i < @_;$i++) { print "$_[$i]\n" } }
|
|
Zur Erinnerung: @_
steht im obigen Beispiel im
skalaren Kontext und gibt daher die Zahl der Elemente in dem
Parameter-Array an.
[Seitenanfang]
Rückgabewerte
Um einen bestimmten Wert an das aufrufende Hauptprogramm zu
liefern, kann die Funktion return()
(Klammern optional)
verwendet werden. Fehlt eine solche Angabe, so ist der
Rückgabewert automatisch das Ergebnis der zuletzt
ausgeführten Operation im Unterprogramm.
Beispiel:
#!/usr/local/bin/perl -w
use strict;
my $s = &S(7,19); print $s."\n"; $s = &T; print $s."\n";
sub S { $_[0] + $_[1] } sub T { return 100; }
|
|
[Seitenanfang]