Perl - Unterprogramme

[ <= ] [ HOME ] [ INHALT ] [ INDEX ] [ => ]

Einführung

Unterprogramme (subroutines) 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

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.

#!/usr/local/bin/perl -w

sub UNTER;                       # Prototyp

print "Hauptprogramm\n";
UNTER;                           # Name allein genügt

sub UNTER {                      # Definition
  print "Unterprogramm\n";
}

Die Definition des Unterprogramms kann (im Gegensatz z.B. zu Pascal) an einer beliebigen Stelle im Quelltext stehen.


[ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ]

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:

#!/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 auf der Seite Variablen und Symboltabellen.


[ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ]

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

&S(1,2);
&S("aaa","bbb","ccc","ddd");

sub S {
  local($i);

  for($i = 0;$i < @_;$i++) { print "$_[$i]\n" }
}

1
2
aaa
bbb
ccc
ddd

Zur Erinnerung: @_ steht im obigen Beispiel im skalaren Kontext und gibt daher die Zahl der Elemente in dem Parameter-Array an.


[ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ]

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

$a = &S(7,19);
print $a."\n";
$a = &T;
print $a."\n";

sub S { $_[0] + $_[1] }
sub T { return 100; }

26
100


[ <= ] [ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ] [ => ]

Autor: Eike Grote Letzte Änderung: 01.11.1999