Einführung
Perl ist eine freie und plattformunabhängige Skriptsprache, die dazu genutzt werden kann, dynamische Webseiten zu erstellen. Hierfür kommuniziert der Webserver mittels der CGI-Schnittstelle mit dem Perl-Interpreter.
Perl wurde 1987 von Larry Wall entworfen. Die Sprache war ursprünglich zur Manipulation von Textdateien sowie zur Steuerung von anderen Programmen gedacht. Mit der Entstehung und Entwicklung des World Wide Webs wurde Perl verstärkt auf Webservern eingesetzt, um somit Webseiten dynamisch erzeugen zu können. Dabei war es Perl schon damals möglich, auch mit anderen Ressourcen wie Dateien und Datenbanken zu arbeiten. Auch wenn PHP in der Zwischenzeit als eindeutiger Marktführer für serverseitige Webanwendungen identifizierbar ist, werden auf vielen Webservern noch immer Perl-Skripte eingesetzt.
Vom Syntax ist Perl an die menschliche Sprache angelehnt, weshalb die Sprache auch als einfach erlernbar gilt. In diesem Thema wollen wir uns jedoch nicht mit den Grundlagen der Sprache Perl, sondern vielmehr mit dem CGI-Modul von Perl beschäftigen, um Ihnen die Erzeugung von dynamischen Webseiten sowie das Verarbeiten von übergebenen URL-Parametern und Formulardaten näher zu bringen. Für einen Schnelleinstieg in Perl können Sie unseren Crashkurs besuchen.
Webserver
Um Perl-Skripte auszuführen, wird auf dem Webserver in erster Linie ein Perl-Interpreter benötigt. Dieser kann auf der Perl-Website heruntergeladen werden. In den meisten Hosting-Angeboten ist ein Perl-Interpreter bereits vom Provider vorinstalliert (da kein Root-Zugriff auf den Server durch den Kunden vorhanden ist), welcher direkt genutzt werden kann. In dem Software-Paket XAMPP, welches unter Webentwicklern sehr beliebt ist, ist Perl bereits enthalten.
Bevor wir uns nun das erste Perl-Skript anschauen, wollen wir uns mit der Funktionsweise der CGI-Schnittstelle
beschäftigen: Bei CGI (Common Gateway Interface) handelt es sich um eine Schnittstelle, die zum Austausch von Daten
zwischen Webserver und anderen Programmen (in diesem Fall der Perl-Interpreter) verwendet wird. Dabei stellt der Webserver
eine sogenannte Laufzeitumgebung zur Verfügung, in welcher das Programm ausgeführt wird und neben Umgebungsvariablen
und Ein- und Ausgabedatenströme (stdin
und stdout
) zur Verfügung gestellt werden. Die
Umgebungsvariablen enthalten Informationen zum Server, zum Skript, zum Anfrager, zur Anfrage und zur HTTP-Verbindung. Die
Ein- und Ausgabedatenströme dienen dazu, die URL-Parameter und Formulardaten vom Browser zur CGI-Applikation und die Ausgaben
von der CGI-Applikation zurück zum Browser zu transportieren. In dem Bild auf der rechten Seite sehen Sie, wie die Anfrage einer
Seite von einem Webserver aussieht.
Erstes Skript
Nun wollen wir uns dem ersten Perl-Skript widmen. An sich enthält die Datei nichts Besonderes: die Shebang-Zeile, welche den
Pfad zum Perl-Interpreter enthält, die use strict;
-Anweisung und eine Ausgabe im Heredoc-Stil. Bei der Ausgabe
wird das HTTP-Headerfeld Content-Type
und das HTML-Dokument ausgegeben. Es gilt dabei, die Leerzeile zwischen
HTTP-Header und dem Inhalt zu beachten, welche nicht fehlen darf. Natürlich kann die Ausgabe auch mit einzelnen
print
-Befehlen erfolgen. Der folgende Code, oder generell ein Perl-Skript, wird zumeist in einer Datei mit der
Endung .pl
oder .cgi
gespeichert.
#!/usr/bin/perl -w use strict; print <<END; Content-Type: text/html;charset=UTF-8 <!Doctype html> <html> <head> <title>Erstes Skript - Perl Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <h1>Hallo Welt</h1> <p>Dies ist das erste Perl-Skript! Abgesehen von der Ausgabe enthält dieses Skript keinen Code.</p> </body> </html> END
Wichtig: Auf einigen Webservern bzw. bei einigen Providern können bzw. dürfen CGI-Skripte nur innerhalb des Ordners
/cgi-bin/
ausgeführt werden. Dies kann auf einem Apache-Webserver mittels der Option ExecCGI
geändert werden. Einige Provider lassen das Setzen dieser Option aber u. U. nicht zu.
Bei Verwendung von XAMPP muss zudem die Shebang-Zeile angepasst werden: #!C:\xampp\perl\bin\perl -w
(bei einer
Standardinstallation). Die Option -w
bewirkt, wie Ihnen vermutlich bekannt ist, die Ausgabe von Warnungen.
Im Gegensatz zu PHP können in Perl Skript-Blöcke nicht im HTML-Code eingebettet werden. Perl wird also nicht dazu
verwendet, einen Teil einer HTML-Seite dynamisch zu erzeugen, sondern erzeugt immer die komplette Ausgabedatei.
Hierfür kann natürlich statischer HTML-Code einfach mittels eines print
-Befehls ausgegeben werden. Das obige
Beispiel enthält keine dynamischen Bestandteile, sondern lediglich einen statischen HTML-Code, welcher mittels des
print
-Befehls ausgegeben wird. Perl muss jedoch neben dem HTML-Code auch noch einen Teil des HTTP-Headers
ausgeben. Dieser kann gegebenenfalls leer sein, jedoch muss zwischen Header und HTML-Code immer eine Leerzeile vorhanden
sein. In dem Fall, dass kein Header mitgeschickt werden soll, bedeutet dies also, dass eine leere Zeile vor dem HTML-Code
notiert werden muss. Grundsätzlich ist es jedoch zu empfehlen, die Content-Type
-Eigenschaft mitzusenden (wie auch
im Beispiel oben).
In den nächsten Beispielen (ausgenommen die vom Thema Umgebungsinformationen) werden wir uns mit
dem CGI-Modul von Perl beschäftigen. Dieses wird mit use CGI;
eingebunden. Anschließend muss noch ein
CGI
-Objekt instanziiert werden. Aus der daraus entstandenen Instanz werden wir später unsere Funktionen aufrufen.
use CGI; my $cgi = new CGI();
Enthält Ihr Perl-Skript einen Fehler, so teilt der Perl-Interpreter dies an den Webserver mit, welcher darauf eine Seite zur
Anzeige eines 500 Internal Server Errors an den Browser schickt bzw. auf ein dazugehöriges ErrorDocument
weiterleitet. Ein solches Verhalten ist gerade für Entwicklungszwecke nicht sehr hilfreich, deshalb empfiehlt es sich, die
Funktion fatalsToBrowser()
aus dem Untermodul Carp
des CGI
-Moduls zu importieren.
Dadurch werden detaillierte Fehlermeldungen (mit Zeilenangaben) an den Browser geschickt. Nachdem Sie die Entwicklung
eines Skripts abgeschlossen haben, sollten Sie die Importierungs-Anweisung wieder entfernen, da wenn Ihr Skript doch noch
einen Fehler enthalten sollte, u. U. sensible Informationen ausgegeben werden, die einen Besucher nichts angehen. Der Import
von fatalsToBrowser()
sieht wie folgt aus:
use CGI::Carp qw(fatalsToBrowser);
Übrigens: Alle unsere Perl-Beispiele enthalten die Anweisung use strict;
, um „unsichere Konstrukte“ nicht
zuzulassen.