# Perl – dynamisch und interaktiv I

Pathologically eclectic rubbish lister.
– Scherzhafte Übersetzung von PERL

Perl ist eine der interessantesten Sprachen, die es gibt. Wir verdanken sie dem Systemprogrammierer Larry Wall. »Perl« steht für »Practical Extraction and Report Language« und sagt bereits alles über die Sprache aus. Ins Deutsche übersetzt bedeutet es »praktische Sprache zum Herausfiltern und Berichten«. Das Ziel von Larry Wall bei der Entwicklung von Perl war es, eine einfache Sprache mit Schleifen, Such- und Ersetzungsroutinen zu entwickeln, die ihm seine Arbeit als Systemprogrammierer erleichtern sollte. Immerhin musste er sowohl Rechnersysteme an der West- als auch an der Ostküste der USA betreuen. Da er mit UNIX-Systemen zu tun hatte und die verbreitetste Sprache damals C war, ist Perl eine Art Synthese aus diesen beiden. Letztlich ist Perl also zu Beginn gar nicht für die Programmierung dynamischer Webseiten gedacht gewesen. Das Geburtsjahr der Sprache ist 1986.

Seitdem ist viel Zeit vergangen, und Perl hat sich zu einem echten Multitalent weiterentwickelt, was vor allem daran liegen mag, dass Wall die Sprache nach vielen Erweiterungen im Internet frei zur Verfügung stellte. Diese Erweiterungen wurden kurzerhand Module genannt, und die Zahl dieser Module ist mittlerweile riesig. Es gibt Module zur Textverarbeitung, zur Dateiverwaltung, für Datenbankzugriffe, zur Netzwerkprogrammierung und zum Erstellen dynamischer Webseiten. Die meisten dieser Module werden bereits mit dem Perl-Interpreter mitgeliefert. Der andere Teil steht im Internet zum Download zur Verfügung.

Perl ist eine Interpreter-Sprache. Der Unterschied zu Compiler-Sprachen wie Java oder C besteht darin, dass Perl-Programme erst zur Laufzeit in eine für die Maschine verständliche Sprache übersetzt werden. Wenn also ein Perl-Programm aufgerufen wird, übersetzt der Perl-Interpreter das Programm und führt es anschließend aus. Nachteilig ist dabei die teilweise sehr lange Ausführungszeit eines interpretierten Programms. Ein deutlicher Vorteil ist jedoch die Plattformunabhängigkeit. Solange der Perl-Interpreter installiert ist, können Sie Perl-Programme sowohl auf UNIX-, Linux-, OS/2-, BeOS- oder Windows-Systemen ausführen.

Aktuell liegt Perl in der Version 5.8 vor. Alle nachfolgenden Erklärungen der Syntax und der Sprache selbst sind jedoch größtenteils auch mit älteren Versionen kompatibel.

# Perl ist nicht CGI

Die Abkürzung CGI steht für »Common Gateway Interface« und bildet die Schnittstelle zwischen Webbrowser, Webserver und Programmen. So können Anfragen eines Webbrowsers an ein Programm auf dem Webserver weitergeleitet und von diesem Programm weiterverarbeitet werden. Diese Anfragen können Formulareingaben eines Benutzers sein, die in ein Gästebuch eingetragen werden sollen, eine Datei vom Rechner des Benutzers, die auf dem Server abgelegt werden soll, oder die Bestelldaten eines Kunden, die zur Abwicklung der Bestellung ausgewertet werden müssen. Gleichzeitig können Programme auf dem Server die Schnittstelle auch zum Übertragen von Daten an den Benutzer verwenden – die Voraussetzung für dynamische Webseiten.

Neben der CGI-Schnittstelle gibt es jedoch noch weitere, in der Regel kommerzielle Schnittstellen. Die bekannteste ist die ISAPI-Schnittstelle von Microsoft, die beim IIS (Internet Information Service) oder PWS (Personal Webserver) Anwendung findet. Diese Schnittstelle ist speziell auf die beiden Microsoft-Server zugeschnitten und arbeitet deshalb wesentlich effizienter als die CGI-Schnittstelle. Letztere ist jedoch kostenlos und unabhängig vom eingesetzten Webserver. Aus diesem Grund ist sie auch bei allen kostenlosen Webservern und somit auch dem populärsten Vertreter dieser Kategorie, dem Apache HTTPD-Server, wiederzufinden.

Damit Programme die CGI-Schnittstelle verwenden können, müssen sie normalerweise in einem speziellen Verzeichnis abgelegt werden, in dem sie ausgeführt werden können. Dies ist in der Regel das cgi-bin-Verzeichnis.

# Das erste Perl-Script

Wie bereits in HTML und JavaScript folgt an dieser Stelle nun ein einfaches Beispielscript, das einen Text im Browser ausgeben soll.

#!/usr/bin/perl
use CGI qw(:standard);
print header();
print "Hallo WorldWideWeb!";

Listing 1.1: Perl-Script, das einen Text im Browserfenster ausgibt

Kopieren Sie den Quellcode aus Listing 1.1 in eine neue Datei, und speichern Sie diese mit der Endung .cgi oder .pl im cgi-bin-Unterverzeichnis Ihres Webservers ab.

Es ist eigentlich ziemlich egal, welche Dateiendung Sie für Ihre Scripts verwenden. Die Endung .pl wird aber im Allgemeinen für Perl-Scripts verwendet, wohingegen .cgi für Scripts verwendet wird, die die CGI-Schnittstelle eines Servers nutzen. Versuchen Sie sich aber möglichst auf eine Endung festzulegen. Wichtig ist nur, dass die Endung auch so in der Konfiguration Ihres Webservers hinterlegt wurde.

Bevor Sie das Script jedoch testen können, müssen Sie zunächst noch eine Änderung vornehmen, und zwar in der ersten Zeile des Scripts, in derjenigen, die mit #! eingeleitet wird. Für x setzen Sie den Buchstaben des Laufwerks ein, auf dem Perl installiert wurde. Anstelle von verzeichnis-von-perl geben Sie das Basisverzeichnis von Perl an, in dem es installiert wurde. Perl wurde bei mir im Verzeichnis d:\perl installiert, aus diesem Grund sieht die erste Zeile des Scripts bei mir folgendermaßen aus:

#!d:\perl\bin\perl.exe

Linux-User können in der Regel in der ersten Zeile

#!/usr/bin/perl

notieren. Dies ist jedoch immer abhängig vom System. Überprüfen Sie daher, wo der Perl-Interpreter bei Ihnen installiert wurde.

Speichern Sie das angepasste Script ab. Starten Sie nun Ihren Browser (und gegebenenfalls Ihren Webserver), und geben Sie als Adresse http://localhost/cgi-bin/dateiname.cgi oder dateiname.pl ein. Die Ausgabe des Perl-Scripts in Ihrem Browser sollte wie folgt aussehen:

Hallo WorldWideWeb!

Wenn dies der Fall ist, funktioniert Ihr Webserver korrekt, und Sie haben dann Ihr erstes Perl-Script erstellt. Sollten Sie eine Fehlermeldung erhalten, überprüfen Sie die Konfiguration des Webservers bzw. den Pfad zum Programm perl.exe in der ersten Zeile des Scripts.

# Textausgabe

Den ersten Unterschied zwischen JavaScript und Perl können Sie bereits anhand des Listing 30.1 erkennen. Anstatt die Methode eines bestimmten Objektes zu verwenden, um einen Text im Browser auszugeben (bei JavaScript document.write), verwenden Sie in Perl die Anweisung print und notieren dahinter in doppelten Anführungszeichen den auszugebenden Text.

In Perl ist es wichtig, jede vollständige Anweisung mit einem Semikolon (bzw. Strichpunkt) abzuschließen. Diese Regel gilt für jede Anweisung. Die erste Zeile hingegen wird nicht mit einem Semikolon abgeschlossen. Den Grund dafür werden Sie etwas später noch erfahren.

Nun zurück zur print-Anweisung. Die typische Syntax für diese Anweisung sieht folgendermaßen aus:

print string;

Anstelle von string können Sie eine beliebige Zeichenkette angeben, die in doppelten Anführungszeichen stehen muss. Sie können aber auch eine beliebige Funktion angeben, die bei einem Aufruf einen String als Wert zurückgibt. In Listing 30.1 werden beide Möglichkeiten verwendet. Einerseits wird eine feste Zeichenkette mit der print-Anweisung ausgegeben, die im Browser dargestellt wird, und andererseits wird der Rückgabewert einer Funktion, nämlich header(), im Browser ausgegeben. Jedes CGI-Programm muss, bevor es Text an einen Browser in HTML-Form sendet, einen HTTP-Header für den MIME-Typ text/html erzeugen. Und exakt das ermöglicht die Funktion header(). Optional könnten Sie als Parameter einen bestimmten MIME-Typ angeben, z. B. image/jpeg für eine Grafik im JPEG-Format.

# Die erste Zeile

Die erste Zeile ist für jedes CGI-Script essenziell, denn sie teilt dem Webserver mit, an welchem Ort er den Interpreter finden kann, mit dem das Programm ausgeführt werden muss. Dies hängt damit zusammen, dass Dateierweiterungen bei einem Webserver nicht zwangsläufig an ein bestimmtes Programm gebunden sind. Deshalb dürfen Sie die Endung für Ihre Scripts auch frei wählen. Unter Windows sind Dateien des Typs .txt z. B. in aller Regel an das Programm notepad.exe gebunden. Dadurch können Sie durch einen Doppelklick auf eine .txt-Datei diese anschließend mit Notepad bearbeiten. Dies funktioniert aber nur bei Dateien mit der Endung .txt. Würde die Endung der Datei .txs lauten, müssten Sie normalerweise erst ein Programm auswählen, mit dem Sie diesen Dateityp öffnen möchten. Unter UNIX-/Linux-Umgebungen können Scripts aber direkt durch Eingabe des Dateinamens ausgeführt werden, und der in der ersten Zeile angegebene Interpreter wird dann zum Ausführen des Scripts verwendet.

Für CGI-Programme bzw. Perl-Scripts bedeutet dies, dass Sie die Endung der Datei beliebig wählen dürfen. So ist es durchaus möglich, Perl-Scripts mit der Endung .cgi, .pl oder .perl zu speichern. Wichtig ist jedoch, dass der Pfad zum Perl-Interpreter korrekt ist. Unter Linux-Systemen ist der Perl-Interpreter in der Regel im Verzeichnis /usr/bin/perl abgelegt. Unter Windows finden Sie den Perl-Interpreter im Verzeichnis x:\installationsverzeichnis\bin\perl.exe. Welche Endung Sie letztlich wählen, bleibt ganz allein Ihnen überlassen. Ich würde Ihnen jedoch die Endung .pl vorschlagen.

Die erste Zeile eines Perl-Scripts wird selten Shebang und sehr häufig Hashbang genannt. Das englische »hash« bedeutet »Rautezeichen« und »bang« steht für das Ausrufezeichen. Die Bezeichnung ist also nicht sehr kreativ, aber treffend.

Außerdem können Sie dem Perl-Interpreter noch bestimmte Parameter übergeben, die sich auf das Verhalten des Interpreters in Bezug auf die Ausführung des Programms auswirken. Zu Beginn und auch bei der Programmierung von Perl-Scripts sollten Sie den Interpreter mit dem Parameter -w aufrufen. Dieser Parameter führt dazu, dass Fehlermeldungen des Perl-Scripts im Browserfenster ausgegeben werden, da diese andernfalls unterdrückt werden. Die modifizierte Hashbang lautet dann für Windows

#!c:\perl\bin\perl.exe -w

und für Linux/UNIX:

#!/usr/bin/perl -w

Zusätzlich gibt es noch weitere Parameter, die an den Interpreter übergeben werden können.

Parameter Beschreibung
-v Gibt Informationen zur Version und Subversion von Perl aus.
-V Liefert eine detaillierte Übersicht über die Konfiguration von Perl.
-w Aktiviert viele nützliche Warnungen.
-W Aktiviert alle Warnungen.
-X Deaktiviert alle Warnungen.
-U Erlaubt fehlerhafte Anweisungen.
-h Gibt eine Liste der Parameter aus.

Tabelle 2.1: Liste der wichtigsten Parameter für den Perl-Interpreter

Im weiteren Verlauf des Buches wird die erste Zeile der Beispiel-Listings

#!/usr/bin/perl -w

lauten. Zum Testen der Listings müssen Sie die Hashbang dann Ihren Anforderungen entsprechend anpassen.

# Notwendige Anweisungen

Wie bereits erwähnt, wurde Perl ursprünglich nicht für den Einsatz als Sprache dynamischer Webseiten konzipiert. Aus diesem Grund sind Methoden wie header() auch nicht von vornherein im Methodensatz des Perl-Interpreters eingebunden. Sie müssen ihn deshalb erweitern, und dies ermöglichen Sie durch das Einbinden eines so genannten Moduls. Die entsprechende Anweisung lautet use.

use module;

Alle Funktionen für das Entwickeln dynamischer Webseiten sind im Modul CGI untergebracht. Leider werde ich in diesem Buch nicht sehr detailliert auf Module eingehen können. Daher sei gesagt, das qw(:standard) den Standard-Methodensatz des Moduls lädt.

# Kommentare und Quellstrukturierung

Gerade bei Perl – und auch später bei PHP – ist das Kommentieren und sinnvolle Strukturieren des Quelltextes äußerst wichtig, da es die Lesbarkeit stark erhöht. Der Grund ist, dass sauberes und übersichtliches Programmieren äußerst schwer ist. Wenn Sie einen sehr kurzen Quelltext haben, trifft dies vielleicht nicht zu, sobald Sie aber bei einem mittellangen Quelltext ankommen, werden Sie sicherlich verstehen, was ich meine. Versuchen Sie deshalb, an sinnvollen Stellen erklärende Kommentare einzufügen. Aber vermeiden Sie den Fehler, zu viel zu kommentieren. Bei einem Quelltext, der zum größten Teil aus Kommentaren besteht, tritt ein umgekehrter Effekt ein: Der Quellcode wird unübersichtlich. Diese Tatsache ist darauf zurückzuführen, dass in Perl nur einzeilige Kommentare möglich sind, die an beliebiger Stelle in einer Zeile mit einem Rautezeichen eingeleitet werden und dann bis zum Ende der Zeile gelten.

# Dies ist ein Kommentar

Prinzipiell können Sie so auch die Hashbang als Kommentar bezeichnen, da auch sie mit einem Rautezeichen eingeleitet wird. Deshalb müssen Sie am Ende der Hashbang auch kein Semikolon setzen. Hinter normalen Kommentaren können Sie das Semikolon ebenfalls entfallen lassen, da alle Zeichen nach dem Rautezeichen bis zum Ende der Zeile als Kommentar gewertet werden.

#!x:\verzeichnis-von-perl\bin\perl.exe  
use CGI qw(:standard);           # Paket für Webseiten einbinden  
print header();                  # MIME-Typ text/html senden  
print "Hallo WorldWideWeb!";     # Ausgabe im Browser

Besonders sinnvoll ist die Verwendung von sprechenden Variablennamen. Darunter versteht man das Bezeichnen einer Variable nach dem Wert, der in ihr gespeichert wird. Möchten Sie z. B. das Alter einer Person in einer Variablen speichern, sagt der Variablenbezeichner

$alter

mehr aus als der Bezeichner

$xy

Mehr dazu erfahren Sie in Kapitel 31, Variablen und Operatoren.

# Zusammenfassung

  • Perl ist die Abkürzung für »Practical Extraction and Report Language«.
  • Die aktuelle Version von Perl ist 5.8.
  • Perl ist eine Interpretersprache.
  • Die erste Zeile eines Perl-Scripts, Hashbang, muss den korrekten Pfad zum Perl-Interpreter enthalten. Diese Zeile wird durch die Zeichenfolge #! eingeleitet.
  • Vor der Ausgabe von HTML-Text muss mit der header-Funktion ein gültiger MIME-Typ an den Browser gesendet werden.
  • Textausgaben in Perl erfolgen über die Anweisung print.
  • Kommentare werden durch das Zeichen # eingeleitet und gelten bis zum Ende der Zeile.

# Fragen und Übungen

  1. Mit welchem Zeichen müssen Sie jede vollständige Anweisung abschließen?
  2. Darf in der ersten Zeile eines Perl-Scripts eine Anweisung stehen oder ein einfacher Kommentar notiert werden?
  3. Wenn nein, aus welchem Grund?
  4. Welches Modul müssen Sie in Ihr Perl-Script einbinden, damit Sie Programme für dynamische Webseiten schreiben können?
  5. Wie lautet die Anweisung zum Einbinden eines Moduls?