Zurück zur Übersicht

CGI.pm - Eine Perl 5 Bibliothek
von A. Grupp


Der Zweck von CGI.pm

Im Kapitel "Doing it the hard way :-)" haben sie gesehen wie auf die an ein Perl-Skript übergebenen Parameter zugegriffen werden kann. Die ganze Angelegenheit ist ziemlich mühsam und muß zudem in jedem ihrer Perlskripte beinhaltet sein. Wie bei anderen Programmiersprachen, bietet es sich an, solche ständig benötigten Funktionalitäten in Form von Bibliotheksmodulen zusammenzufassen. In einem derartigen Modul (Bibliothek, Library) werden nach Möglichkeit alle artverwandten Funktionen zusammengefaßt, und dem Anwender zur Verfügung gestellt. Bei CGI.pm handelt es sich um ein derartiges Bibliotheksmodul. Es stellt eine Fülle an Funktionen zur Verfügung die den Bereich CGI-Programmierung, dynamische Formularerzeugung bzw. ganz allgemein dynamische HTML-Seitenerzeugung abdecken. Es handelt sich um ein sehr mächtiges Modul mit einer Fülle an Funktionen. Dieses Dokument behandelt nur einen Bruchteil der Möglichkeiten und soll ihnen ein bißchen Appetit auf diese Modul machen. Den gesamten Modulumfang beschreibt die Dokumentation von Lincoln Stein.

Nachfolgend also eine nicht erschöpfende Zusammenfassung der Moduldokumentation.

Einbindung von CGI.pm in ihre Skripte

Das Modul kann auf zwei verschieden Arten benutzt werden. Sie können die einzelnen Funktionen in den Namensraum ihres Skripts importieren und sie anschließend direkt aufrufen. Bei der anderen Variante erstellen sie ein CGI-Objekt. Dieses beinhaltet dann die gesamten Funktionen des Moduls als Methoden und stellt ihnen alle Daten des aktuellen CGI-Aufrufs zur Verfügung. Obwohl der objektorientierte Ansatz ein bißchen mehr Schreibaufwand bedeutet, sollten sie im wegen der höheren Flexibilität und dem geringeren Hauptspeicherbedarf den Vorzug geben.

Nachdem sie mit use CGI; das Modul in ihr Skript eingebunden haben, erzeugen sie sich durch $anfrage = new CGI; ein CGI-Objekt.

#!/usr/bin/perl

use CGI;
$anfrage = new CGI;

Das Objekt $anfrage wird dabei vom Modulkonstruktor mit den aktuell übergebenen Aufrufdaten des Skripts (z.B. den ganzen Umgebungsvariablen) initialisiert. Es wird überprüft ob dem Skript Daten übergeben wurden. Falls ja werden diese wie im vorigen Kapitel beschrieben wieder aufgetrennt und die MIME-Kodierung rückgängig gemacht. Es enthält außerdem alle Methoden die zur Bearbeitung der Daten benötigt werden sowie Methoden um die Antwort zu erzeugen.

Das "Hello world"-Beispiel mit CGI.pm

#!/usr/bin/perl

use CGI;
$anfrage = new CGI;

print $anfrage->header(),
      $anfrage->start_html("Hello world"),
      $anfrage->h1("Hello world"),
      $anfrage->a({-href=>"index.html#bsp1"},"Zurück"),
      $anfrage->end_html();
Beispiel 1

Diese Skript erzeugt den folgenden HTML-Output der direkt an den Client-Browser ausgegeben wird.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML><HEAD><TITLE>Hello world</TITLE>
</HEAD><BODY><H1>Hello world</H1>
<A HREF="index.html#bsp1">Zurück</A>
</BODY></HTML>

Anhand dieses Beispiels wird der Aufruf der CGI.pm-Methoden bereits deutlich. Ausgehend vom CGI-Objekt $anfrage wird mit Hilfe des -> Operators die Methode aufgerufen. Je nach Methode können, bzw. müssen noch Parameter übergeben werden. Der Syntax stellt sich damit so dar:

$cgiobjekt->methoden_name(Parameterliste);

Zugriff auf die Übergabedaten

Ein Grund für die Verwendung von CGI.pm war der angeblich leichte Zugriff auf die übergebenen Paramter. Dabei wird neben anderen Methoden vor allem param() verwendet. Je nach Aufrufart liefert diese Methode verschiedene Ergebnisse:

  1. @names = $anfrage->param;

    liefert eine Liste aller übergebenen Schlüsselwörter in Form eines Arrays. Bekanntlich kann mit

    $anzahl = $#names

    festgestellt werden wieviele Elemente das Array beinhaltet. Damit ist es z.B. einfach möglich festzustellen ob und wieviele Parameter an das Skript übergeben wurden.

  2. Ist der Name eines Parameters bekannt, so kann mit

    $name = $anfrage->param("nachname");

    der Parameterwert direkt bestimmt werden. Die MIME-Kodierung des Werts wurde bereits bei der Objektinitialisierung rückgängig gemacht.

    Wird auf einen leeren oder nicht existenten Parameter zugegriffen, so ist der Rückgabewert undefiniert. Dies kann mit defined() überprüft werden.

    if( defined($anfrage->param("nachname")) ){
       $name = $anfrage->param("nachname");
    }

    Handelt es sich um die Daten eines Auswahlfelds mit Mehrfachselektion, so wird ein Array zurückgegeben.

    @werte = $anfrage->param("multiauswahl");

CGI.pm erkennt selbständig die verwendete Übermittlungsmethode (POST/GET), so dass auch dies vom Programmierer nicht mehr berücksichtigt werden muß.

Der HTTP-Header

Ein CGI-Skript muß, wie bereits bei der CGI-Einführung beschrieben, zumindest den Content-type des HTTP-Headers erzeugen und übertragen. Der http-Server erzeugt dies bei CGI-Skripten nicht. Schließlich kann ein Perl-Skript auch ein GIF-Grafik erstellen und als Output an den Client-Browser liefern. Die einfachste Form ist hier

print $anfrage->header();

Dabei wird die Defaulteinstellung text/html als MIME-Typ verwendet. Andere MIME-Typen müssen explizit als Parameter angegeben werden.

print $anfrage->header('image/gif');

wäre also ein gültiger HTTP-Header falls unser Skript eine GIF-Grafik erzeugt (z.B. Zählergrafik, Meßwertplot, etc.).

Außer dem Content-type können noch eine Menge weiterer Zeilen des HTTP-Headers gesetzt werden. So ist es z.B. möglich das Gültigkeitsdatum des Dokuments zu setzen um auf das Caching von Proxy-Servern oder Clientcaches Einfluß nehmen zu können. Dabei werden der header()-Methode weitere Parameter übergeben. In diesem Fall müssen jedoch auch die Parameternamen nach folgendem Syntax übergeben werden:

print $anfrage->header(-paramname1=>'paramwert1',
                       -paramname2=>'paramwert2',
                       -...);

Beispiel:

print $anfrage->header(-type=>'image/gif',
                       -status=>'200 OK',
                       -expires=>'+3d',
                       -cookie=>$my_cookie);

Damit wird eine GIF-Grafik beim Client angekündigt deren Gültigkeit in 3 Tagen abläuft. Außerdem wird versucht ein Cookie (der Wert muß vorher mit cookie() erzeugt werden) auf die Platte des Benutzers zu schreiben.

Die HTML-Datei selbst

Das Grundgerüst der HTML-Datei läßt sich ebenfalls mit fertigen Methoden erzeugen. Dazu dienen die Methoden start_html() und end_html(). Sie erzeugen die vollständige Struktur einer HTML-Datei die nur noch um den <BODY>-Teil ergänzt werden muß.

Beispiel:

print $anfrage->start_html(-title=>'Sein oder nicht sein ...',
                           -author=>'grupp@elektronikschule.de',
                           -style=>{'src'=>'/styles/style1.css'},
                           -BGCOLOR=>'blue');
print "Und hier kommt noch ein BODY-Text
print $anfrage->end_html(); 

Für die Methode start_html() gibt es noch einige andere Parameter (-title, -author, -base, -xbase, -target, -meta, -dtd, -style, -head, -script, -noscript, -onLoad, -onUnload) und die Möglichkeit beliebige Parameter im BODY-Tag zu platzieren.

Auch die HTML-Tags im BODY-Bereich werden von CGI.pm unterstützt. Beispiele:

Formulare

Eine weiter Stärke von CGI.pm liegt in der einfachen Erzeugung von Formularen. Es gibt hier eine Fülle an verschiedenen Methoden. Formulare deren Auswahllisten aus einer Datenbank stammen, können damit auf eine sehr flexible Weise gestaltet werden. Nachfolgend nur ein kurzes Codebeispiel (für weitere Informationen lesen sie am besten gleich in der Originaldoku nach).

$method="POST";
$action="verarbeitung.pl";
$encoding="application/x-www-form-urlencoded";
print $anfrage->startform($method,$action,$encoding);
print $anfrage->textfield(-name=>'nachname',
                          -default=>'Bitte Nachname eingeben',
                          -size=>30,
                          -maxlength=>50);
print $anfrage->password_field(-name=>'passwort',
                               -value=>'',
                               -size=>10);
print $anfrage->submit(-name=>'abschicken',
                       -value=>'Ich haben fertig ...');
print $anfrage->reset;
print $anfrage->endform;

Zurück zur Übersicht

 Lokal bzw. Remote-Zugriffe seit dem 14. Juni 1999