SELFHTML: CGI/Perl / Perl-Sprachelemente / CGI-typische Anweisungen in Perl
Description: (SELFHTML 7.0) Welche Perl-Anweisungen typisch für den einsatz in CGI-Scripts sind.
Keywords: SELFHTML, Perl, CGI

SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente

| ## CGI-typische Anweisungen in Perl
| Formulardaten einlesen Eingelesene Formulardaten als Mail zum Formularanbieter senden HTML-Code an Browser senden

## Formulardaten einlesen

Den folgenden Perl-Code können Sie verwenden, um Formulardaten eines beliebigen HTML-Formulars über CGI einzulesen. Beachten Sie, daß dies kein vollständiges Perl-Script ist, sondern lediglich ein in sich abgeschlossener Programmteil, den Sie für eigene Zwecke verwenden können.

### Perl-Code:

    if($ENV{'REQUEST_METHOD'} eq 'GET')
     {
      $Daten = $ENV{'QUERY_STRING'}
     }
    else
     {
      read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
     }

    @Formularfelder = split(/&/, $Daten);
    foreach $Feld (@Formularfelder)
     {
      ($name, $value) = split(/=/, $Feld);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/<!--(.|\n)*-->//g;
      $Formular[$i] = $name;
      $i = $i + 1;
      $Formular[$i] = $value;
      $i = $i + 1;
     }

### Erläuterung:

Der obige Perl-Code prüft zuerst, ob das HTML-Formular die Methode GET oder POST anwendet, und holt sich abhängig davon die übergebenen Formulardaten. Es ist also egal, welche Methode im HTML-Formular angegeben wird - dieser Perl-Code kommt in jedem Fall an die übergebenen Daten.

Die Daten stehen zunächst in dem Skalar `$Daten`. Der Wert von `$Daten` hat in diesem Stadium das Aussehen des Formulardatenstroms bei der Übertragung von Formulardaten.

Mit der Anweisung `@Formularfelder = split(/&/, $Daten);` wird die Zeichenkette `$Daten` in eine Liste verwandelt. Als Trennzeichen, das aus dem Datenstrom Listenelemente macht, wird das kaufmännische Und (&) angegeben. Durch dieses Zeichen sind die im Formulardatenstrom die einzelnen Formularfelder voneinander getrennt.

Anschließend werden die einzelnen Felder der neuen Liste `@Formularfelder` in einer foreach-Schleife behandelt. Zuerst wird jedes Formularfeld in zwei Bestandteile zerlegt, wobei als Trennzeichen das Istgleichzeichen angegeben wird. Die beiden Teile werden in den Skalaren `$name` und `$value` abgelegt. In `$name` steht dann genau das, was in dem betreffenden HTML-Formularelement mit der Angabe `name=` definiert wurde. In `$value` steht das, was der Anwender als Wert für das betreffende Formularelement eingegeben oder ausgewählt hat. Angenommen, das HTML-Formular enthält ein einzeiliges Eingabefeld, das mit `<input name="Spitzname" size=60 maxlength=60>` definiert wurde. Weiter angenommen, der Anwender hat in diesem Feld "Hotzenplotz" eingegeben. Dann steht für dieses Formularfeld im Skalar `$name` der Wert `Spitzname`, und im Skalar `$value` steht der Wert `Hotzenplotz`.

Mit den Suche-Ersetze-Vorgängen in den weiteren Anweisungen der for-Schleife werden die störenden Steuerzeichen, die noch aus dem Formulardatenstrom übrig geblieben sind, entfernt.

Die Daten des Formulars werden schließlich in eine Liste `@Formular` geschrieben. Die geraden Elemente dieser Liste, also `$Formular[0]`, `$Formular[2]`, `$Formular[4]` usw. enthalten die Feldnamen, zu denen der Anwender Angaben gemacht hat. Die ungeraden Elemente, also `$Formular[1]`, `$Formular[3]`, `$Formular[5]` enthalten die jeweils zugehörigen Daten, die der Anwender eingegeben oder ausgewählt hat. Diese Liste können Sie im weiteren Verlauf des Perl-Scripts weiterverarbeiten.

### Beachten Sie:

Die hier vorgestellten Beispiel-Codes sind sehr primitiv und haben eher die Aufgabe, das Prinzip der Abläufe zu erläutern. Wenn Sie eine professionellere Lösung benötigen, müssen Sie diese selbst programmieren oder auf ein ausgereiftes Freeware-Script zurückgreifen.

## Eingelesene Formulardaten als Mail zum Formularanbieter senden

Ausgefüllte Formulardaten können Sie beispielsweise in eine Datei auf dem Server schreiben, die Sie regelmäßig auswerten. Die meisten Anbieter möchten ausgefüllte Formulardaten jedoch gleich als E-Mail zugeschickt bekommen.
Der folgende Perl-Code setzt auf dem Perl-Code weiter oben auf, muß also im gleichen Script weiter unten stehen.

### Perl-Code:

    $Mailprogramm = "/usr/lib/sendmail";  # siehe Erläuterung unten
    $MailSubject = "Formluar-Feedback";   # siehe Erläuterung unten
    $Empfaenger = "IhrName\@Provider\.xxx"; # siehe Erläuterung unten
    $SenderName = $Formular[1];           # siehe Erläuterung unten
    $SenderMail = $Formular[3];           # siehe Erläuterung unten

    open(MAIL,"|$Mailprogramm -t") || die;

    print MAIL "To: $Empfaenger\n";
    print MAIL "From: $SenderMail $SenderName\n";
    print MAIL "Subject: $MailSubject\n\n";

    $i = 0;
    $max = $#Formular;
    for($i=0;$i<=$max;$i=$i+2)
    {
     print MAIL "$Formular[$i]: $Formular[$i+1]\n";
    }
    close(MAIL);

### Erläuterung:

Der obige Perl-Code definiert zunächst einige Skalare.
Der erste und wichtigste Skalar ist `$Mailprogramm`. Hier müssen Sie angeben, wo sich auf dem Server-Rechner das Programm befindet, das als Server für abgehende E-Mails arbeitet. Das Standard-Programm dafür ist das Programm `sendmail`, das auf fast allen Server-Rechnern im Internet eingesetzt wird - ein typischer Eintrag ist auf Unix-Rechnern daher `/usr/lib/sendmail`. Fragen Sie gegebenenfalls Ihren Provider, was Sie hierbei genau eintragen müssen. Wenn dieser Wert fehlt oder falsch ist, funktioniert die E-Mail-Übertragung nicht!
Dem Skalar `$MailSubject` im obigen Perl-Code können Sie das Subject der Feedback-Mail angeben, die Ihnen zugeschickt wird.
Bei dem Skalar `$Empfaenger` müssen Sie Ihre eigene E-Mail-Adresse angeben bzw. die Adresse, an die die Mails geschickt werden sollen.
Die beiden Skalare `$SenderName` und `$SenderMail` wurden im obigen Perl-Code eigentlich nur der besseren Lesbarkeit wegen definiert. Diesen Skalaren werden bestimmte Inhalte aus dem Formular zugewiesen. Das geht allerdings nur, wenn Ihr Formular ein Feld für den Namen des Ausfüllers und ein Feld für dessen E-Mail-Adresse enthält. Tragen Sie in diesem Fall die korrekten Indexnummern # bei `$Formular[#]` ein (siehe dazu weiter oben).

Der obige Perl-Code öffnet im weiteren Verlauf die Programmdatei des Mail-Servers. Die Option `-t` bei der `open`-Funktion bezieht sich auf das angenommene Programm `sendmail`. Wenn Sie ein anderes Programm benutzen oder benutzen müssen, erkundigen Sie sich, wie man dieses Programm mit auszuliefernden Mail-Daten aufrufen kann!
Wenn das Programm nicht geöffnet werden kann, wird das obige Perl-Script mit `die` kommentarlos beendet. An dieser Stelle könnten Sie eine Fehlerbehandlung einbauen.

Mit den `print`-Befehlen schreibt das Script die ihm bekannten Daten in den Mailheader. Jede Internet-E-Mail hat ein einheitliches Format. Im Kopf der Mail stehen diverse Angaben. Einige davon werden erst im Verlauf der Reise zum Empfänger gesetzt.

Innerhalb der for-Schleife werden die einzelnen Formulardaten in die E-Mail geschrieben. Feldnamen und Feldinhalte des ausgefüllten Formulars werden durch Doppelpunkt voneinander getrennt.

### Beachten Sie:

Die hier vorgestellten Beispiel-Codes sind sehr primitiv und haben eher die Aufgabe, das Prinzip der Abläufe zu erläutern. Wenn Sie eine professionellere Lösung benötigen, müssen Sie diese selbst programmieren oder auf ein ausgereiftes Freeware-Script zurückgreifen.

## HTML-Code an Browser senden

Eine der wichtigsten Aufgaben von CGI-Scripts ist es, HTML-Code an den aufrufenden WWW-Browser zu senden. Dabei dürfen Sie Variablen Ihres Perl-Scripts nach Belieben in den HTML-Code mit einbauen.
Der folgende Perl-Code setzt auf dem Perl-Code weiter oben auf, muß also im gleichen Script weiter unten stehen. Er sendet ein Dankeschön an den Anwender, der ein Formular ausgefüllt hat.

### Perl-Code:

    print "Content-type: text/html\n\n";
    print "<html>\n";
    print "<head>\n";
    print "<title>Danke!</title>\n";
    print "</head>\n";
    print "<body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=006600 alink=#0000FF>\n";
    print "<h1>Danke</h1>\n";
    print "Wir freuen uns, da&szlig; Sie unser Formular ausgef&uuml;llt \n";
    print "haben. Hier zur Kontrolle Ihre Angaben:<p>\n";

    for($i=0;$i<=$max;$i=$i+2)
    {
     print "<b>$Formular[$i]:</b> $Formular[$i+1]<br>\n";
    }
    print "<p><hr noshade size=1><p>";
    print "<i>Ihr Name, <a href=\"mailto:IhrName\@Provider.xx\">IhrName\@Provider.xx</a></i>";
    print "</body>\n";
    print "</html>\n";

### Erläuterung:

HTML-Code können Sie in Perl ganz einfach mit Hilfe der `print`-Funktion schreiben. Im obigen Code wird auf diese Weise eine vollständige HTML-Datei an den WWW-Browser geschickt.

Wichtig ist dabei zunächst die erste Anweisung. Sie lautet stets print "Content-type: text/html\n\n";. Das ist noch kein HTML-Code. Der WWW-Browser, der den Code empfängt, erwartet zunächst einen HTTP-Header. Dieser Header muß zumindest Informationen darüber enthalten, welche Art von Daten folgen. Mit dieser Anweisung teilen Sie dem Browser mit, daß HTML-Code folgt. Unbedingt wichtig sind dabei auch die beiden `\n\n` am Ende!

Danach werden mit `print` die üblichen Befehle zum Aufbau einer HTML-Datei notiert. Besondere Beachtung verdient die for-Schleife in der Mitte des Beispiel-Codes. Dort werden die Inhalte der Liste `@Formular` (siehe weiter oben) HTML-formatiert ausgegeben. Diese Möglichkeit, Variableninhalte direkt in den auszugebenden HTML-Code einzubinden, ist der Grund, warum CGI häufig auch als "dynamisches HTML" bezeichnet wird.

Schließlich sollten Sie noch die HTML-Ausgabe des mailto-Befehls im unteren Teil des Beispiel-Codes beachten. Wenn Sie HTML-Tags mit Angaben ausgeben wollen, die in Anführungszeichen stehen müssen, so wie die `href`-Angabe, dann müssen Sie die Anführungszeichen mit einem umgekehrten Schrägstrich maskieren. Sonst würde der Perl-Interpreter einen Fehler melden. Ebenfalls maskieren müssen Sie auf die gleiche Weise das E-Mail-Zeichen `@`, da dieses Zeichen in einer `print`-Funktion von Perl andernfalls als Name einer auszugebenden Liste interpretiert würde.

weiter: | Computer und geschriebene Sprache
zurück: | Mit Zahlen und Zeit arbeiten

SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente
© 1998 Stefan Münz, muenz@csi.com