# Perl - Unterprogramme

### 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.

### 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.

### 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.

### 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

Autor: Eike Grote | Letzte Änderung: 03.11.2004