Unterprogramme

[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]


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" }
}
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.

[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; }
26
100

[Seitenanfang]


[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]

Autor: Eike Grote Version: 2.06 (15.9.2013)