SELFHTML/Navigationshilfen CGI/Perl Perl-Sprachelemente |
Um eigene Perl-Scripts auszuführen bzw. zu testen, müssen Sie den Perl-Interpreter installiert haben. Um Perl als Sprache für CGI-Scripts einzusetzen, muss außerdem ein Web-Server installiert sein.
Bei CGI-Scripts fordert der Web-Browser vom Web-Server über HTTP eine Datei an, die der Web-Server als auszuführendes Script erkennt. Um zu wissen, dass die vom Browser angeforderte Datei ein auszuführendes CGI-Script ist, prüft der Web-Server verschiedene Kriterien:
Diese Faktoren bewirken, dass, wenn der Browser ein Perl-Script im CGI-Verzeichnis aufruft, der Web-Server entsprechend reagiert und den Quelltext des Scripts nicht einfach an den Browser sendet, sondern den Perl-Interpreter mit dem CGI-Script aufruft.
Perl ist aber nicht nur für CGI-Scripts gedacht. Perl-Scripts können zahllose Aufgaben auf einem Rechner übernehmen, z.B. Backups organisieren, die Rechnerauslastung analysieren, in Dateien nach etwas suchen und es durch etwas anderes ersetzen usw. Um Perl-Scripts auszuführen, die nicht als CGI-Scripts eingesetzt werden, müssen Sie einen Zugang zu einer Shell oder Kommandozeile auf dem Rechner haben. Am lokalen PC und unter MS Windows können Sie ein DOS-Fenster öffnen. Dann können Sie den Perl-Interpreter vom DOS-Prompt aus aufrufen. Bei Unix-basierten Systemen benötigen Sie einen Zugang als Benutzer. Nach dem Anmelden am System erhalten Sie eine Shell, also eine benutzereigene Kommandozeile. Von dort aus können Sie den Perl-Interpreter aufrufen, vorausgesetzt Sie haben die Rechte dazu. Wenn Sie Perl-Scripts über Kommandozeile auf einem entfernten Rechner ausführen wollen, also etwa auf einem öffentlichen Server, wo Sie Web-Speicherplatz gemietet haben, dann brauchen Sie einen Telnet- oder SSH-Zugang zu diesem Rechner. Außerdem benötigen Sie ein Telnet- oder SSH-Programm (im Online-Angebot des SELFHTML Linkverzeichnisses finden Sie WWW-Links zu Telnet- und SSH-Programmen). Mit einem solchen Programm können Sie sich aus der Ferne an einem Rechner anmelden und erhalten eine Shell zum Eingeben von Kommandos. Fragen Sie gegebenenfalls Ihren Provider danach, ob Sie Telnet- oder SSH-Zugang zum Server haben!
Von der Kommandozeile aus können Sie den Perl-Interpreter mit einem Perl-Script, also einer Datei mit Perl-Code, aufrufen. Solche Dateien haben die Standard-Dateinamenendung .pl. Der Perl-Interpreter wird normalerweise einfach durch Eingabe von perl gestartet. Wenn Sie beispielsweise ein Perl-Script namens hallowelt.pl haben, können Sie dieses Script mit perl hallowelt.pl starten. Gegebenenfalls müssen Sie sowohl den Perl-Interpreter als auch das Perl-Script mit den korrekten Pfadnamen aufrufen, unter DOS/Windows also z.B. c:\www\bin\perl.exe c:\scripts\perl\hallowelt.pl, unter Unix-basierten Systemen z.B. /usr/bin/perl /scripts/perl/hallowelt.pl.
Neben der reinen Angabe einer Perl-Datei gibt es Optionen beim Aufruf des Perl-Interpreters. Die Optionen folgen unmittelbar hinter dem Programmdateinamen und vor dem Namen des Perl-Scripts, also etwa perl -c test.pl. Sie können auch mehrere Optionen aneinanderhängen. Notieren Sie dazu nur ein Minuszeichen mit allen gewünschten Optionsbuchstaben hintereinander, z.B. perl -cwT test.pl
Die folgende Tabelle enthält einige Optionen beim Aufruf des Perl-Interpreters.
|
In der ersten Zeile eines Perl-Scripts, der so genannten "Shebang-Zeile", muss eine Anweisung stehen, die angibt, wo sich die ausführbare Datei des Perl-Interpreters befindet.
#!/usr/bin/perl print "Hallo Welt\n"; |
Die Anweisung zur Lage des Perl-Interpreters auf dem Rechner beginnt mit den Zeichen #!
, dem so genannten Shebang, - gefolgt von der Pfadangabe und dem Namen des Perlinterpreters. Ab der zweiten Zeile können Sie Perl-Code notieren, wie im Beispiel die Ausgabe der beiden Wörter Hallo Welt
.
Die Anweisung zur Lage des Perl-Interpreters auf dem Rechner wird vor allem von Unix-basierten Systemen ausgewertet, und zwar dann, wenn die Perl-Datei auf den Modus "ausführbar" gesetzt ist. Die Datei kann dann direkt aufgerufen werden und startet den Perl-Interpreter. Wenn Sie unter anderen Umgebungen als Unix arbeiten, notieren Sie einfach die übliche Zeile mit der üblichen Pfadangabe (#!/usr/bin/perl
) in der ersten Zeile Ihres Perl-Scripts. Sollte das Script dann nicht ausgeführt werden bzw. eine Fehlermeldung produzieren, notieren Sie den genauen Pfad der ausführbaren Datei des Perl-Interpreters. Trennen Sie dabei die Verzeichnisse durch einfache Schrägstriche. Eine typische Angabe unter MS Windows ist beispielsweise #!/programme/perl/bin/perl.exe
.
Bei Web-Servern mit CGI-Unterstützung hängt es vom Web-Server-Produkt ab, ob die Zeile für die Lage des Perl-Interpreters ausgelesen wird. Zu den Grundeinstellungen eines Web-Servers gehört mittlerweile auch die Angabe des Pfades zum Perl-Interpreter. Wenn dann bei laufendem Web-Server ein Perl-Script über das HTTP-Protokoll ausgeführt wird, ruft der Web-Server den Perl-Interpreter entsprechend seiner Konfiguration auf.
Wenn der Perl-Interpreter im Suchpfad für ausführbare Programme liegt, der z.B. in der Umgebungsvariablen PATH gespeichert ist, dann genügt es, in der ersten Zeile des Perl-Scripts zu notieren:
#!perl
Hinter der Pfadangabe zum Perl-Interpreter kann, durch Leerraum getrennt, auch noch eine Aufrufoption folgen wie in der Tabelle bei den Aufrufmöglichkeiten des Perl-Interpreters beschrieben. So können Sie beispielsweise notieren:
#!/usr/bin/perl -w
Damit weisen Sie den Perl-Interpreter an, neben Fehlern auch Warnungen zu melden. Diese Option wird von Perl-Programmierern gerne empfohlen (siehe auch Sauberer Programmierstil).
Perl besteht wie andere Programmiersprachen aus einer kontrollierten Anordnung von Anweisungen. Das sind Befehle, die der Perl-Interpreter bewertet und in Maschinencode umsetzt, der auf dem betreffenden Rechner ausführbar ist.
Es gibt einfache und komplexere Anweisungen.
#!/usr/bin/perl $Zahl = 42; $Quadrat = $Zahl * $Zahl; print "Das Quadrat von ", $Zahl, " = ", $Quadrat, "\n"; |
Eine Anweisung in Perl besteht aus einem Befehl, der normalerweise mit einem Strichpunkt ;
abgeschlossen wird.
Eine Anweisung ist es zum Beispiel:
$Zahl = 42;
.print
.Ein Anweisungsblock besteht aus einer oder mehreren einzelnen Anweisungen, die innerhalb einer übergeordneten Anweisung stehen. So können Anweisungsblöcke beispielsweise innerhalb einer bedingten Anweisung oder innerhalb einer Schleife stehen. Auch alle Anweisungen, die innerhalb einer Subroutine stehen, bilden einen Anweisungsblock.
if($Zahl > 1000) { $Zahl = 0; } |
my $i = 1; while($i <= 99) { print "Das Quadrat von ", $i, " ist ", $i * $i, "\n"; $i = $i + 1; } |
Ein Anweisungsblock wird durch eine öffnende geschweifte Klammer {
begonnen und durch eine schließende geschweifte Klammer }
beendet.
Bei bedingten Anweisungen (wie in Beispiel 1) oder bei Schleifen (wie in Beispiel 2) müssen Sie solche Anweisungsblöcke notieren, auch wenn nur eine einzige Anweisung von der Bedingung oder der Schleifenbedingung abhängig ausgeführt werden soll.
Anweisungsblöcke können auch verschachtelt sein.
Wie jede bessere Programmiersprache erlaubt Perl das Notieren von Kommentaren. Kommentare werden nicht als Code interpretiert und erläutern das Script oder machen den Code besser lesbar.
my $i = 1; # hier wird die Variable $i initialisiert #========================================= # es folgt die Ausgabe der Quadratzahlen # von 1 bis 99 #========================================= while($i <= 99) { print "Das Quadrat von ", $i, " ist ", $i * $i, "\n"; $i = $i + 1; } |
Kommentare in Perl beginnen mit einem Gatterzeichen #
. Alles, was hinter dem Gatterzeichen bis zum Ende der Zeile steht, wird von Perl ignoriert. Beginnt eine Zeile mit dem Gatterzeichen, ist die gesamte Zeile ein Kommentar. Viele Perl-Programmierer nutzen die Kommentartechnik auch, um ihre Scripts optisch kunstvoll zu gestalten. Das obige Beispiel zeigt solch ein optisches Konstrukt mit Gleichheitszeichen.
Neben der einfachen Auskommentierung besteht auch die Möglichkeit, größere Abschnitte des Scripts als Dokumentation auszuweisen. Solche Dokumentationen können mit dem Programm perldoc, das zum Lieferumfang des Perl-Interpreters gehört, separat gelesen werden. Bei komplexeren Scripts können Sie so die Dokumentation gleich zum Script mit dazuliefern. Im Zusammenhang mit Modulen wird im Abschnitt Moduldokumentationen lesen mit perldoc beschrieben, wie solche Abschnitte aussehen. Was dort für Module beschrieben wird, funktioniert in jedem Perlscript.
An vielen Stellen in Perl müssen Sie selbst Namen vergeben, zum Beispiel für Variablen wie Skalare, Arrays oder Hashes, sowie für Subroutinen.
my $Daten = $ENV{'QUERY_STRING'}; |
Im Beispiel ist Daten
ein selbst vergebener Name. Bei selbst vergebenen Namen gelten folgende Regeln:
_
beginnen. Mit einer Ziffer oder einem anderen Zeichen dürfen sie nicht beginnen.$user
und $User
bezeichnen unterschiedliche Variablen!_
enthalten.Vergeben Sie sprechende Namen, die Ihnen auch ein halbes Jahr, nachdem Sie das Perl-Script geschrieben haben, noch signalisieren, welche Bedeutung sie haben. Es dürfen ruhig auch deutschsprachige Wörter sein, solange die genannten Regeln eingehalten werden.
Seit Perl-Version 5.6.0 können Perlscripts auch in Unicode notiert werden. Damit ist es möglich, auch beispielsweise Umlaute in Variablennamen zu verwenden. Die Perlscripts müssen dann UTF-8-codiert sein. In einem Editor, der diese Codierung nicht beherrscht, sieht dann eine Variable $Straße
beispielsweise so aus: $Straße
Es gibt ein paar Dinge, die ein sauber geschriebenes Perl-Script enthalten sollte. Ohne diese Dinge funktionieren die meisten Perl-Scripts zwar genauso gut, aber kritische (mehrdeutige) Anweisungen im Quelltext fallen dann nicht auf und können leichter zu Fehlern führen. Das folgende kleine Perl-Script enthält ein paar Dinge, die von Perl-Programmierern zum sauberen Programmieren empfohlen werden.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $headline = "Ein sauberes Script!"; print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; print "<h1>$headline</h1>\n"; print "<p>nur auf das CGI-Modul wurde hier verzichtet ;-)</p>\n"; print "</body></html>\n"; |
Zu den empfohlenen Maßnahmen sauberer Programmierung zählt auf jeden Fall die Verwendung der Aufrufoption -w
in der ersten Zeile des Scripts. Dadurch gibt der Perl-Interpreter Warnungen zu zweifelhaften Befehlen aus, bevor er das Script ausführt. Manche Unsauberkeiten im Quellcode werden so ohne zeitraubende Suche erkannt.
In die gleiche Richtung zielt die Anweisung use strict;
. Damit wird ein spezielles Pragma-Modul eingebunden, das bewirkt, dass der Perl-Interpreter keine unsicheren Konstrukte akzeptiert, bevor er das Script ausführt. Das können zum Beispiel nicht definierte Variablen sein. Auch damit lassen sich Fehler vermeiden, die durch unachtsames oder schlampiges Programmieren entstehen können und bei einer toleranteren Interpretation des Quelltextes nicht auffallen.
Die Anweisung use CGI::Carp qw(fatalsToBrowser);
wird CGI-Programmierern dringend empfohlen. Sie bindet ein spezielles Modul ein, das beim Abbruch des Scripts aufgrund eines Syntax-Fehlers oder einer Anweisung wie die die Fehlerursache direkt auf die Standardausgabe schreibt, also an den aufrufenden Browser übergibt. Auf diese Weise sparen sich CGI-Programmierer, beim Scriptabbruch in der meist langen Error-Logdatei des Web-Servers nach der Fehlermeldung zu suchen. Diese Anweisung nutzt jedoch nichts, wenn bereits Fehler auftreten, bevor der Perl-Interpreter ausgeführt werden kann, also etwa, wenn die erste Zeile des Perl-Scripts eine falsche Lage des Perl-Interpreters ausweist.
Wenn Sie use strict;
angeben, zwingt Perl Sie dazu, alle Ihre Variablen vor der ersten Verwendung zu deklarieren (z.B. mit my
). Im obigen Beispiel ist dies bei der Initialisierung von $headline
der Fall. Dies hat den Vorteil, dass logische Fehler im Script entstehen, wenn Sie im weiteren Verlauf des Scripts einen Variablennamen falsch geschrieben haben. Die Verwendung von my bewirkt, dass eine Variable nur in der aktuellen Datei oder im aktuellen Anweisungsblock gültig ist. Näheres dazu bei der Beschreibung der Funktion my.
Wie Sie dem Quellcode des obigen Beispiels entnehmen können, gibt das Script in seiner Ausgabe an den aufrufenden Browser mit einem verschmitzten Lächeln zu, dass es nicht das CGI-Modul verwendet. Tatsächlich sollten Sie sich, wenn Sie CGI-Scripts schreiben wollen, mit diesem Modul und seiner Syntax beschäftigen. Die Drohung mit dem Zeigefinger, dieses Modul verwenden zu sollen, ist bei manchen Hardlinern zwar schon zur krankhaften Zwangsgebärde geworden, doch für viele CGI-Scripts ist die Verwendung des CGI-Moduls auf jeden Fall zu empfehlen.
Generell gehört es zum sauberen Programmierstil, auf vorhandene und bewährte Ressourcen zurückzugreifen. Perl wird ja nicht nur alleine als Perl-Interpreter ausgeliefert, sondern mit einer ganzen Reihe von fertigen Code-Modulen, die viele Programmieraufgaben erleichtern. Nachdem Sie sich mit den Sprachelementen und eingebauten Funktionen von Perl etwas vertraut gemacht haben, sollten Sie sich daher auf jeden Fall auch mit den Perl-Modulen beschäftigen.
Bei größeren Scripts sollten Sie den Quellcode auf Subroutinen verteilen. Mit dieser Technik können Sie Anweisungsblöcke definieren, die bestimmte Aufgaben übernehmen und von verschiedenen anderen Stellen im Script aus aufgerufen werden können. Ferner können Sie die Technik der Subroutinen dazu nutzen, um den Scriptablauf in Teilprozeduren zu zerlegen und nur bestimmte Teile des Scripts auszuführen.
Seit der Version 5 des Interpreters erlaubt Perl auch objektorientiertes Programmieren. Das ist zwar für Neulinge erst mal ein wenig schwieriger zu begreifen, doch wenn man es sich angewöhnt, werden größere Anwendungen in Perl letztlich einfacher zu programmieren, und der Code sieht deutlich besser lesbar aus.
Zum "sauberen Programmieren" gehören schließlich folgende allgemeine Empfehlungen:
$name
, $telephone
, $mail
und $homepage
haben, als wenn diese $name
, $Telefonnummer
, $mail_Adresse
und $Homepage
heißen.CGI-notwendige Anweisungen in Perl | |
HTML-Formulare und CGI | |
SELFHTML/Navigationshilfen CGI/Perl Perl-Sprachelemente |
© 2001 selfhtml@teamone.de