# CGI-notwendige Anweisungen in Perl

| HTTP-Header und Inhalte senden Inhalte senden (alternative Form)

## HTTP-Header und Inhalte senden

Ein CGI-Script wird vom Webserver aufgerufen, sobald ihm der anfragende Browser eine Aufforderung dazu etwa durch das Abschicken eines Formulars signalisiert. Dazu kommuniziert zunächst der Browser mit dem Webserver über das HTTP-Protokoll und fordert das Script an. Bei dieser Anforderung kann der Browser auch gleich Daten versenden, die für das CGI-Script gedacht sind, z.B. Daten aus einem ausgefüllten HTML-Formular. Der Webserver entscheidet, ob es sich bei der vom Browser angeforderten Datei um ein CGI-Script handelt und lässt das Script vom Perl-Interpreter ausführen. Während dies geschieht, "wartet" der Browser jedoch auf Daten. Denn wenn der Browser vom Server ein CGI-Script anfordert, ist das für ihn nichts anderes, als ob er eine statische HTML-Datei anfordern würde. Er wartet auf Daten, die der Server sendet und die er (der Browser) als nächstes anzeigen soll. Deshalb muss der Script-Interpreter unmittelbar bei der Auswertung eines CGI-Scripts irgendetwas an den Webserver schicken, damit der es an den wartenden Browser weitersenden kann. Die zu sendenden Daten müssen dabei wieder über das HTTP-Protokoll verschickt werden. Das HTTP-Protokoll verlangt nun für jeden Datenversand einen so genannten HTTP-Header. Das ist eine Art Vorab-Datenpaket mit Informationen zu den nachfolgenden Daten. Damit ein Browser die Daten korrekt interpretieren kann, muss das Script also zunächst die Sendung eines gültigen HTTP-Headers veranlassen.

### Beispiel eines vollständigen CGI-Scripts:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Text = "Hallo Welt";

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Hallo Welt</title></head><body>\n";
    print "<h1>$Text</h1>\n";
    print "</body></html>\n";

### Erläuterung:

Für den HTML-Code, den ein Perl-Script als CGI-Script ausgeben lassen soll, ist die Perl-Funktion print geeignet. Zum "Senden" gibt das Perl-Script einfach mit der `print`-Funktion Daten aus. Die erste dieser `print`-Anweisungen, die ein CGI-Script enthalten muss, ist jedoch diejenige für den HTTP-Header. Die einfachste Form eines HTTP-Headers besteht schlicht aus dem Befehl `Content-type:` und der Angabe eines MIME-Typs für die nachfolgenden Daten. Da das CGI-Script HTML-Code an den Browser senden will, benutzt es den MIME-Typ für HTML, nämlich `text/html`. Weiterhin muss ein HTTP-Header zwei abschließende Steuerzeichen für Zeilenumbruch enthalten. In Perl lässt sich ein solcher Zeilenumbruch durch die Zeichenfolge `\n` erzeugen. Durch die Anweisung:
`print "Content-type: text/html\n\n";`
wird also ein vollständiger HTTP-Header erzeugt, der dem Browser signalisiert, dass Daten vom Typ HTML folgen. Für eine vollständige HTTP-Kommunikation sind freilich noch mehr HTTP-Headerzeilen notwendig; die fehlenden Angaben werden dann von der CGI-Schnittstelle bzw. vom Webserver ergänzt.

Anschließend wird mit einzelnen `print`-Anweisungen eine vollständige kleine HTML-Datei an den Browser gesendet. Bei den einzelnen `print`-Anweisungen ist am Ende übrigens immer ein Zeilenumbruch-Zeichen `\n` notiert. Dies hat eher kosmetische Gründe. Dadurch wird im erzeugten HTML-Quelltext jeweils eine neue Zeile begonnen. Wenn diese Steuerzeichen fehlen würden, dann würde Perl den gesamten HTML-Code in eine Textzeile schreiben, und falls Sie sich diesen Quelltext in Ihrem Browser anschauen möchten, sehen Sie einen absatzlosen Brei aus Buchstaben und Zahlen, der sehr schwer lesbar ist. Bei der Variante oben wird der HTML-Quelltext dagegen nach jeder `print`-Anweisung umbrochen.

Innerhalb der `h1`-Überschrift wird im obigen Beispiel eine Variable ausgegeben, nämlich der Skalar `$Text`. Sie können innerhalb von `print`-Ausgaben einfach solche Variablen einfügen. An der entsprechenden Stelle wird dann der aktuelle Wert der Variablen ausgegeben. Im obigen Beispiel wird dem Skalar `$Text` weiter oben im Script der Wert `Hallo Welt` zugewiesen. Dieser Wert wird an der Stelle, wo `$Text` im auszugebenden HTML-Code notiert ist, eingesetzt.

## Inhalte senden (alternative Form)

Die vielen einzelnen `print`-Anweisungen sind bei längeren Ausgaben lästig. Es gibt deshalb auch eine elegantere Form der Ausgabe größerer HTML-Code-Abschnitte.

### Beispiel eines vollständigen CGI-Scripts:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Einleitung = "Es geht auch so!";

    print "Content-type: text/html\n\n";

    print <<"ENDE";
    <html><head><title>Testausgabe</title></head><body>
    <h1>$Einleitung</h1>
    <p>Der Vorteil bei dieser Form ist, dass man viel HTML-Code
    auf einmal erzeugen kann, ohne einen einzigen weiteren print-Befehl
    in Perl zu notieren. Praktisch beispielsweise auch zum Ausgeben
    von JavaScript:</p>
    <script type="text/javascript">
    document.write("<p>Und die Adresse dieser HTML-Datenquelle lautet: ");
    document.write(document.URL+"<\/p>");
    </script>
    </body></html>
    ENDE

### Erläuterung:

Das Script sendet zunächst mit einer einzelnen `print`-Anweisung den HTTP-Header. Anschließend wird jedoch eine elegantere Methode benutzt, um größere Mengen HTML-Code zu senden. Dabei wird zunächst die Anweisung `print <<"ENDE";` notiert. `ENDE` ist ein frei vergebbarer Name für einen Endbegrenzer. Ganz unten im Script ist dann noch einmal das Wort `ENDE` notiert, und zwar alleinstehend in einer Zeile. Alles, was zwischen der einführenden Anweisung und dem alleinstehenden Endbegrenzer steht, wird so wie es da steht an den Browser gesendet. Sinnvoll ist diese Form der Notation, wenn längere Abschnitte HTML-Code gesendet werden sollen. Der HTML-Code kann alles mögliche enthalten, zum Beispiel auch JavaScript-Bereiche, wie im Beispiel gezeigt, aber auch Perl-Variablen! Diese werden interpoliert, d.h. bei der Ausgabe durch ihren Wert ersetzt - allerdings nur, weil `print <<"ENDE";` mit doppelten Anführungszeichen notiert wurde. Erlaubt ist auch die Notation mit einfachen Anführungszeichen, also `print <<'ENDE';`. In diesem Fall werden keine Perl-Variablen interpoliert (siehe auch: Regeln beim Notieren von Zeichenketten). Eine weitere Möglichkeit besteht darin, die Anführungszeichen ganz wegzulassen, also `print <<ENDE;`. In diesem Fall gelten dieselben Regeln wie bei der Notation mit doppelten Anführungszeichen.

### Beachten Sie:

Hinter dem Endbegrenzer muss in Ihrem Script auf jeden Fall ein Zeilenumbruch notiert werden, gerade auch dann, wenn es sich um die letzte Zeile im Script handelt.

Eine weitere oft genutzte Möglichkeit, HTTP-Header und HTML-Code an den Browser zu senden, bietet das CGI-Modul an. Dieses Modul stellt eigene Methoden bereit, um (X)HTML-Ausgaben zu erzeugen. Zum Senden an den Browser wird aber auch dort die `print`-Funktion verwendet.

| Skalare (Variablen)
| Einführung in Perl

© 2007 Impressum