SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente

| ## Unterprogramme und Perl-Funktionen
| Unterprogramme Unterprogramme mit Parameterübergaben und Rückgabewert Lokale Variablen Perl-Funktionen

## Unterprogramme

Bei komplexeren Perl-Scripts ist es empfehlenswert, bestimmte Programmteile in selbst definierte Unterprogramme zu verlagern. Auf diese Weise können Sie das Script besser strukturieren. Sinnvoll ist das vor allem bei Programmteilen, die im Laufe des Scripts mehrmals ausgeführt werden. Bevor Sie also eine größere Prozedur mehrmals im Script notieren, sollten Sie die entsprechende Prozedur in ein Unterprogramm stecken und dieses Unterprogramm an der gewünschten Stelle aufrufen.

### Beispiel:

    #!/usr/bin/perl

    $Ergebnis = 1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9;
    &Ausgabe;
    $Ergebnis = sqrt(sqrt(81));
    &Ausgabe;

    sub Ausgabe
    {
     print "Das Ergebnis lautet: ", $Ergebnis, "\n";
    }

### Erläuterung:

Ein Unterprogramm definieren Sie mit dem Schlüsselwort `sub`. Dahinter folgt ein frei wählbarer Name, der den Namenskonventionen von Perl entsprechen muß. Im obigen Beispiel wird auf diese Weise ein Unterprogramm `sub Ausgabe` definiert. Der gesamte Inhalt des Unterprogramms muß in geschweiften Klammern stehen. Sie können beliebige und beliebig viele Anweisungen innerhalb des Unterprogramms notieren.

Mit einem kaufmännischen Und-Zeichen `&` und anschließendem Unterprogrammnamen rufen Sie ein Unterprogramm auf. Der Aufruf ist eine eigene Anweisung, muß also wie andere Anweisungen mit einem Strichpunkt abgeschlossen werden. Im obigen Beispiel kommt zwei mal die Anweisung `&Ausgabe;` vor. Dadurch wird das Unterprogramm mit dem Namen `Ausgabe` aufgerufen.

### Beachten Sie:

Es ist egal, an welcher Stelle innerhalb des Scripts ein Unterprogramm steht. Bei der Interpretation führt der Perl-Interpreter zuerst diejenigen Anweisungen der Reihe aus, die außerhalb der Unterprogramme stehen.

Die Unterprogramme werden beim Aufruf automatisch gesucht.

## Unterprogramme mit Parameterübergaben und Rückgabewert

Sie können ein Unterprogramm aufrufen, das einen Wert ermittelt und diesen an die aufrufende Anweisung zurückgibt.

### Beispiel:

    #!/usr/bin/perl

    $x = &Rechne(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9);
    print $x, "\n";

    sub Rechne
    {
     return eval($_[0]);
    }

### Erläuterung:

Im Gegensatz zu anderen Programmiersprachen wie etwa C oder auch Java und JavaScript brauchen Sie bei einem Unterprogramm, dem Parameter übergeben werden sollen, bei der Definition des Unterprogramms keine Parameterdeklarationen anzugeben. Im obigen Beispiel wird das Unterprogramm `Rechne` mit einem Parameter aufgerufen: `(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9)`. Das Unterprogramm `Rechne` verarbeitet diesen Parameter mit dem Konstrukt `$_[0]`. Dahinter steckt eine vordefinierte Variablen, nämlich die Liste `@_`. Es handelt sich um die Liste der übergebenen Parameter. `$_[0]` greift auf den ersten übergebenen Parameter zu, `$_[1]` auf den zweiten Parameter usw. Mit einer Anweisung wie `for(@_) { print $_, "\n"; }` können Sie beispielsweise auch alle übergebenen Parameter abarbeiten, ohne wissen zu müssen, wie viele Parameter übergeben wurden. So einfach ist das sonst in kaum einer Programmiersprache.

Der lange Rechenausdruck, der im obigen Beispiel an das Unterprogramm Rechne übergeben wird, ist ein einziger Parameter. Wenn Sie mehrere Parameter übergeben wollen, trennen Sie diese durch Kommata.

Um aus einem Unterprogramm einen Wert an eine aufrufende Anweisung zurückzugeben, benutzen Sie am besten die Perl-Funktion `return`. Dahinter können Sie z.B. eine Variable angeben, deren aktuellen Wert Sie zurückgeben wollen. Im obigen Beispiel gibt `return` direkt den Rückgabewert einer Perl-Funktion weiter, nämlich den Rückgabewert der Funktion `eval()`. Diese Funktion bewertet eine Zeichenkette als Rechenoperation und gibt das errechnete Ergebnis zurück.

Im obigen Beispiel wird der von `Rechne` zurückgegebene Wert in dem Skalar `$x` gespeichert. Dazu wird diesem Skalar einfach der Aufruf des Unterprogramms `Rechne` zugewiesen.

## Lokale Variablen

Im Gegensatz zu den meisten anderen Programmiersprachen behalten Variablen, die innerhalb eines Unterprogramms definiert werden, nach Beenden des Unterprogramms ihre Gültigkeit. Das bedeutet, daß Sie keine zwei gleichnamigen Variablen im gesamten Script definieren können. Denn sobald Sie mit der zweiten Variablen irgendetwas anstellen, verändern Sie einfach den aktuellen Inhalt der ersten, bereits vorhandenen. Diese Eigenschaft hat Perl den Ruf eingetragen, daß man damit nicht sauber strukturiert programmieren könne. Es gibt jedoch längst die Möglichkeit, die Lebensdauer einer Variablen innerhalb von Unterprogrammen auf das Unterprogramm zu beschränken.

### Beispiel 1:

    #!/usr/bin/perl

    &Rechne(3*12);
    print $x, "\n";

    sub Rechne
    {
     $x = eval($_[0]);
    }

### Beispiel 2:

    #!/usr/bin/perl

    &Rechne(3*12);
    print $x, "\n";

    sub Rechne
    {
     my $x = eval($_[0]);
    }

### Erläuterung:

In Beispiel 1 wird zuerst das Unterprogramm Rechne aufgerufen. Dort wird ein Skalar `$x` definiert, der den ersten übergebenen Parameter errechnet. Sonst tut das Unterprogramm nichts weiter. Im Hauptprogramm geht es anschließend damit weiter, daß der Inhalt von `$x` ausgegeben wird. Das funktioniert - `$x` hat seinen Wert nach Beenden des Unterprogramms `Rechne` also nicht verloren.
Beispiel 2 unterscheidet sich von Beispiel 1 nur durch ein einziges Wörtchen, nämlich das Wörtchen `my` vor der Definition von `$x`. Durch Voranstellen von `my` wird ein Skalar, eine Liste, ein Hash usw. innerhalb eines Unterprogramms als lokal definiert. Im obigen Beispiel 2 bleibt der im Hauptprogramm definierte Skalar `$x` leer, und es wird nichts ausgegeben.

## Perl-Funktionen

Perl ist unter anderem deshalb so mächtig, weil der Perl-Interpreter etliche vordefinierte Unterprogramme - hier Perl-Funktionen genannt - kennt. Es gibt Perl-Funktionen für die unterschiedlichsten Aufgaben. Viele davon lernen Sie in den Abschnitten Dateien lesen und schreiben, Zeichenketten und Listen manipulieren und Mit Zahlen und Zeit arbeiten kennen.

### Beispiel:

    #!/usr/bin/perl

    print "Geben Sie eine Reihe von Begriffen, getrennt durch Kommata, ein:\n";
    $Eingabe = <STDIN>;
    @Liste = split(/,/, $Eingabe);
    @SortierteListe = sort(@Liste);
    print "Danke! Und hier die Ausgabe der alphabetisch sortierten Begriffe:\n";
    for(@SortierteListe)
     {
      if(/\n/)
       {
        chop($_);
       }
      print $_, "\n";
     }

### Erläuterung:

Die erste Perl-Funktion, die im obigen Beispiel vorkommt, ist `print`. Meistens werden Perl-Funktionen zwar wie in C oder deren Verwandten mit Klammern () aufgerufen, aber erforderlich ist das nicht. Bei so häufig benutzten Funktionen wie `print` ist das Verwenden der Klammer daher mittlerweile der Schreibfaulheit zum Opfer gefallen. Wenn Sie beispielsweise statt des Funktionsaufrufs `sort(@Liste)` (siehe obiges Beispiel) `sort @Liste` notieren, erkennt Perl das auch an.

Eine Perl-Funktion bekommt in der Regel Parameter übergeben, mit denen sie irgendetwas tut. So ist im Beispiel `"Geben Sie eine Reihe von Begriffen, getrennt durch Kommata, ein:\n";` ein Parameter, der der `print`-Funktion übergeben wird. Weiter unten im Beispiel wird der Funktion `sort` als Parameter die Liste mit dem Namen `@Liste` übergeben. Wenn Sie einer Funktion mehrere Parameter übergeben, trennen Sie diese durch Kommata.

Perl-Funktionen haben in der Regel auch einen Rückgabewert. Im obigen Beispiel übernimmt etwa die Perl-Funktion `sort` die Sortierung der übergebenen Liste. Zurück gibt die Funktion eine neue Liste, nämlich mit den sortierten Elementen.

Zwei weitere Perl-Funktionen im obigen Beispiel sind `split` und `chop`.
Die `split`-Funktion kann in einer Zeichenkette nach Zeichen oder Zeichenketten suchen, die Sie mit Hilfe eines regulären Ausdrucks als Parameter übergeben. Außerdem muß noch die Zeichenkette oder der Skalar übergeben werden, der eine entsprechende Zeichenkette enthält. Dann liefert `split` eine Liste mit Elementen zurück, die durch die angegebene Trennregel voneinander getrennt wurden.
Die `chop`-Funktion beseitigt das letzte Zeichen einer Zeichenkette. Das ist häufig sinnvoll, da Zeichenketten in Perl oft automatisch ein Steuerzeichen für Zeilenumbruch (\n) angehängt bekommen.

weiter: | Dateien lesen und schreiben
zurück: | Steuerzeichen und besondere Notationen

SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente

© 1998 Stefan Münz, muenz@csi.com