Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungCGI CGI.pm use CGI, param(), objektorientiert, Das CGI.pm Modul | param(), ... GGI Kurs Kapitel 8

Das CGI.pm Modul          zurück zum Inhaltsverzeichnis

Nachdem Sie im Kapitel zuvor gesehen haben, wie man codierte Formulareingaben dekodiert, dürfte sich wohl die Frage stellen, ob noch nie einer auf die Idee gekommen ist, ein Modul dafür zu schreiben. Bevor Sie sich nun hinsetzten und solch ein Modul erstellen wollen, können Sie sich mal das Modul CGI.pm ansehen.

Der Vorteil von diesem Modul ist auch, dass Sie damit CGI-Skripte schreiben können, ohne das Sie ein Perl-Guru oder ein HTML-Freak sind. CGI.pm nimmt uns praktisch fast die ganze Arbeit ab. Dieses Modul stellt Ihnen sehr viele Funktionen zur Verfügung, womit Sie die meisten CGI-Aufgaben erledigen können.

In diesem Kapitel will ich Ihnen das CGI.pm Modul nur kurz vorstellen. Über die Vielfalt dieses Moduls würde sich ein ganzes Buch verfassen lassen. Im Anhang dieses Tutorials finden Sie unter Weiterführende Links einige Quellen mit Dokumentationen zu diesem Modul.

Als Beispiel zur Demonstration des Moduls, soll wieder das Eingabeformular vom Kapitel Daten der Formulare dekodieren - Der Algorithmus dienen ...

Name :
EMail:
Hobby:

Wie wir die Eingabe des Formulares mit einem CGI-Skript ohne dem CGI.pm Modul ausgewerten, haben Sie bereits gesehen. Jetzt folgt die Möglichkeit das Ganze mit dem CGI.pm Modul zu machen.

Um das CGI-Modul zu verwenden, haben Sie zwei Möglichkeiten zur Verfügung. Zum einen die Standardschreibweise und zum anderen die objektorientierte Schreibweise.

Zuerst wollen wir die Standardschreibweise verwenden. Hierzu nun das Skript um die Daten des Formulares auszuwerten ...

#!/usr/bin/perl -w

use strict;
use CGI qw( :standard);

my $name = param("name");
my $email= param("e-mail");
my $hobby= param("hobby");

print header("text/html");
print start_html("Dekodieren eines Formulars");
print p("Ihr Name : $name");
print p("E-Mail   : $email");
print p("Ihr Hobby: $hobby");
print end_html;

Dieses Skript macht tatsächlich dasselbe wie unser Skript vom Kapitel zuvor. Einfacher kann man es einem nicht mehr machen. Mit ...

use CGI qw( :standard);

... geben wir an, dass wir die Standardschreibweise auf das Modul CGI anwenden. Die einzelnen Parameter unseres Formulars, haben wir mit der Funktion param() herausgelesen und dekodiert ...

my $name = param("name");
my $email= param("e-mail");
my $hobby= param("hobby");

Ob Sie hierbei nun die POST-Methode oder die GET-Methode verwenden, bleibt egal. Darum müssen Sie sich nicht mehr kümmern. Allerdings sollten Sie die einzelnen Parameter auf undef überprüfen, da es ja sein kann, das der Anwender gar nichts eingegeben hat.

Den Header geben Sie mit der Funktion header() an ...

print header("text/html");

Und selbst bei den einzelnen HTML-Tags nimmt uns das CGI-Modul sämtliche Arbeiten ab ...

print start_html("Dekodieren eines Formulars");
print p("Ihr Name : $name");
print p("E-Mail   : $email");
print p("Ihr Hobby: $hobby");
print end_html;

Hierzu erfolgt jetzt dasselbe Skript nochmals in der Objektorientierten Schreibweise ...

#!/usr/bin/perl -w

use strict;
use CGI;

my $q = new CGI;
my $name = $q->param("name");
my $email= $q->param("e-mail");
my $hobby= $q->param("hobby");

print $q->header("text/html");
print $q->start_html("Dekodieren eines Formulars");
print $q->p("Ihr Name : $name");
print $q->p("E-Mail   : $email");
print $q->p("Ihr Hobby: $hobby");
print $q->end_html;

Ob Sie nun die Standardschreibweise oder die Objektorientierte Schreibweise verwenden, bleibt Ihnen überlassen. Sofern Sie sich aber nicht mit der Objektorientierten Programmierung auskennen, wäre die Standardschreibweise besser geeignet.

Bei all dieser Einfachheit, werden Sie sich nun fragen, warum die meisten CGI-Skripte, die man herunterladen kann, ohne dem CGI-Modul geschrieben wurden? Es gibt einige Verfechter dieses Moduls, die meinen, das dieses zu gross geraten sei und somit Arbeitsspeicher verschwendet wird. Mittlerweile werden aber schon viele Tricks verwendet, um die Geschwindigkeit von CGI.pm zu beschleunigen.

Ich habe diese ewige Diskusion mal mit folgendem Skript getestet ...

#!/usr/bin/perl -w

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


my $anfang1;
my $anfang2;
my $ende1;
my $ende2;

print header("text/html");
print start_html("Dekodieren eines Formulars");

$anfang1=(times)[0];
foreach(0 .. 100000){
print p("Testausgabe mit CGI");
}
$ende1=(times)[0];

print ($ende1-$anfang1 ) . "Sekunden";

$anfang2=(times)[0];
foreach(0 .. 100000){
print ("<p>Testausgabe ohne CGI");
}
$ende2=(times)[0];


print p ($ende1-$anfang1 ) . "Sekunden<br>";
print p ($ende2-$anfang2 ) . "Sekunden";

print end_html;

Zum einen werden 100000 Ausgaben mit einer Funktion des CGI-Moduls auf dem Bildschirm gemacht. Und zum anderen ohne dem CGI-Modul. Natürlich lässt sich so nicht unbedingt eine pauschale Leistungsmessung erstellen. Dabei spielen logischerweise noch ander Faktoren ein Rolle. Jede Version gibt hier also ca. 2,3 Megabyte (!) an Daten auf dem Bildschirm aus (im Durchschnitt besitzten Webseiten ca 20-100 Kilobytes). Dabei konnte ein geringer Unterschied festgestellt werden. Die Ausgabe mit dem CGI-Modul benötigte bei mir auf dem lokalen Rechner ca. 2,7 Sekunden. Ohne dem CGI-Modul wurden nur noch 2 Sekunden benötigt.

Wenn man jetzt allerdings vom Umfang der Daten absieht (welcher in diesem Beispiel total übertrieben ist), besteht eigentlich kein nenneswerter Unterschied mit oder ohne dem CGI-Modul.