Sie können die Ausführung von Anweisungen von Bedingungen abhängig machen.
Anzeigebeispiel: So sieht's aus - ohne Übergabeparameter
Anzeigebeispiel: So sieht's aus - mit 3 Zeichen (abc) als Übergabeparameter
Anzeigebeispiel: So sieht's aus - mit dem String "selfhtml" als Übergabeparameter
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Testausgabe</title>\n"; print "</head><body>\n"; if( $ENV{QUERY_STRING} eq "" ) { print "<b>Dem Script wurden keine Daten übergeben!</b>\n"; } elsif( length($ENV{QUERY_STRING}) < 4 ) { print "<b>Übergebene Daten enthalten weniger als 4 Zeichen!</b>\n"; } elsif( length($ENV{QUERY_STRING}) > 8 ) { print "<b>Übergebe Daten enthalten mehr als 8 Zeichen!</b>\n"; } else { print "<p><b>folgende Daten wurden dem Script übergeben:</b><br> $ENV{QUERY_STRING}</p>"; (my $String, my $Salt) = split(/\+/,$ENV{QUERY_STRING}); my $CryptString = crypt($String,$Salt); print "<p><b>Verschlüsselt lauten die Daten:</b><br>$CryptString</p>\n"; } print "</body></html>\n";
Das Beispiel-Script erwartet, dass ihm beim Aufruf eine Zeichenkette mit mindestens 4 bis maximal 8 Zeichen Länge übergeben wird. Diese Daten verschlüsselt es mit der Funktion crypt und gibt den verschlüsselten Wert zur Kontrolle aus. Übergeben können Sie dem Script die Zeichenkette beim Aufruf im Browser etwa als Parameter. Wenn das Script also beispielsweise die Adresse http://localhost/cgi-bin/crypt.pl hat, können Sie es mit http://localhost/cgi-bin/crypt.pl?Mimose aufrufen, und es verschlüsselt die Zeichenkette Mimose
nach dem crypt-Standard. Wenn Sie das Script dagegen ohne Parameter aufrufen oder eine zu kurze oder zu lange Zeichenkette übergeben, dann gibt es stattdessen eine Fehlermeldung aus.
Um diese bedingungsabhängigen Aktionen auszuführen, fragt das Script zunächst ab, ob die CGI-Umgebungsvariable QUERY_STRING
leer ist. Mit if
können Sie eine solche Wenn-Dann-Bedingung einleiten. Dahinter folgt, in Klammern stehend, die Formulierung der Bedingung. Um solche Bedingungen zu formulieren, brauchen Sie entweder zwei Werte, die Sie vergleichen möchten, oder Sie fragen direkt, ob ein in den Klammern stehender Ausdruck wahr oder falsch ist. Im Beispiel werden in der Bedingung zwei Werte verglichen, nämlich $ENV{QUERY_STRING}
(die Umgebungsvariable, die übergebene Parameter enthält) mit dem so genannten Leerstring, der durch leere Anführungszeichen ""
markiert wird. Das eq
dazwischen ist ein Vergleichsoperator für Zeichenketten. Vergleichsoperatoren müssen Sie kennen, um Bedingungen formulieren zu können, in denen zwei Werte verglichen werden.
Im Anschluss an die if
-Bedingung folgt ein Anweisungsblock, markiert wie üblich durch geschweifte Klammern {
und }
. Dazwischen können beliebig viele Anweisungen stehen. Diese Anweisungen werden aber nur dann ausgeführt, wenn die if
-Bedingung wahr ist. Im Beispiel wird mit der if
-Bedingung abgefragt, ob die Umgebungsvariable mit den übergebenen Daten leer ist. Wenn dies der Fall ist, also wenn diese Bedingung wahr ist, dann wird ausgegeben: Dem Script wurden keine Daten übergeben!
. Die anschließenden Anweisungsblöcke, die hinter den beiden elsif
und else
folgen, werden in diesem Fall übersprungen.
Mit elsif
können weitere Bedingungen formuliert werden. Abgeprüft werden diese Bedingungen aber erst, wenn alle unmittelbar voranstehenden Bedingungen unwahr waren. Das zweite elsif
im Beispiel wird also nur dann überhaupt von Perl bewertet, wenn Daten übergeben wurden, und wenn diese nicht weniger als 4 Zeichen enthalten. Die beiden elsif
-Bedingungen im Beispiel vergleichen wieder zwei Werte, nämlich die Länge der übergebenen Daten, ermittelt mit der Funktion length, mit einer jeweils festen Zahl.
Erst wenn alle if
- und elsif
-Bedingungen unwahr sind, wird der else
-Zweig ausgeführt. Dieser braucht keine Bedingung mehr, sondern bedeutet einfach den "Ansonsten-Fall". Da im obigen Beispiel die zuvor notierten Bedingungen Fehler abfangen, steht dort im else
-Zweig der Code für den "Gutfall". Die Daten werden zur Kontrolle ausgegeben, verschlüsselt und dann in verschlüsselter Form nochmals ausgegeben.
Die geschweiften Klammern nach einem if
, elsif
oder else
müssen immer notiert werden, auch dann, wenn nur eine einzige Anweisung darin notiert wird. Dies ist in Perl anders als in manchen anderen Sprachen, etwa in JavaScript.
Bedingungen können auch andersherum formuliert werden.
Anzeigebeispiel: So sieht's aus - ohne Übergabeparameter
Anzeigebeispiel: So sieht's aus - mit dem String "strenggeheim" als Übergabeparameter
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Testausgabe</title>\n"; print "</head><body>\n"; unless( $ENV{QUERY_STRING} eq "strenggeheim" ) { print "<b>Keine Erlaubnis!</b>\n"; } else { open (FH, "</usr/bin/apache/conf/httpd.conf"); my @Dateizeilen = <FH>; close(FH); print "<h1>Aktuelle Konfiguration des Apache-Servers</h1>\n"; print "<pre>@Dateizeilen</pre>\n"; } print "</body></html>\n";
Das Script formuliert mit unless
eine "Wenn-nicht"-Bedingung. Innerhalb der Bedingung wird verglichen, ob die Umgebungsvariable QUERY_STRING
den Wert strenggeheim
hat. Die Bedingung ist also wahr, wenn der Anwender im Browser das Script beispielsweise mit http://localhost/cgi-bin/show_apache.pl?strenggeheim aufgerufen hat. Durch unless
wird die Bedingung jedoch als Ganzes verneint. Anweisungen, die in dem Anweisungsblock stehen, der in den geschweiften Klammern abhängig von unless
ausgeführt wird, wird im Beispiel nur dann ausgeführt, wenn der Anwender das Script nicht mit dem Übergabeparameter strenggeheim
aufgerufen hat.
In diesem Fall gibt das Script eine Fehlermeldung aus und überspringt den else
-Zweig. Hat der Anwender den richtigen Übergabeparameter eingegeben, gelangt das Script dagegen in den else
-Zweig. Dort liest es die zentrale Konfigurationsdatei des Apache-Webservers ein und gibt deren Inhalt im Browser aus. Die dabei verwendeten Perl-Funktionen sind open und close.
Um eine einzelne Anweisung abhängig von einer Bedingung auszuführen, erlaubt Perl auch eine besondere, etwas kürzere Form von Bedingungen.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @Datumzeit = localtime(time); my $Stunden = $Datumzeit[2]; print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "<h1>Guten Morgen!</h1>" if ( $Stunden > 5 && $Stunden < 10 ); print "<h1>Guten Tag!</h1>" if ( $Stunden > 9 && $Stunden < 19 ); print "<h1>Guten Abend!</h1>" if ( $Stunden > 18 ); print "<h1>Hi Nachteule!</h1>" unless ( $Stunden > 5 ); print "</body></html>\n";
Das Script ermittelt mit der Funktion localtime Datum und Uhrzeit auf dem Server. Aus den Gesamtdaten, die diese Funktion liefert, werden die Stunden extrahiert und im Skalar $Stunden
gespeichert. Das Script gibt nun im HTML-Code eine Überschrift mit einem uhrzeitabhängigen Text aus. Dabei steht die print
-Anweisung vorne, und die Bedingung ist jeweils nachgestellt. Die jeweilige print
-Anweisung wird nur dann ausgeführt, wenn die dahinter notierte Bedingung wahr ist. Wie Sie dem Beispiel entnehmen können, sind nachgestellte Bedingungen sowohl mit if
als auch mit unless
möglich.
Das Besondere an den nachgestellten Bedingungen ist, dass nur eine Anweisung abhängig davon ausgeführt werden kann. Denn der gesamte Ausdruck inklusive der Bedingung stellt eine einzige Anweisung dar. Deshalb gibt es bei solchen Bedingungen auch keine geschweiften Klammern.
Das Beispiel zeigt auch noch einmal einige weitere Bedingungen. In einigen der Fälle sind nämlich auch zwei Bedingungen verknüpft. So wird Guten Morgen
nur dann ausgegeben, wenn die Stundenzahl der Server-Uhrzeit größer als 5 und kleiner als 10 ist, also zwischen 6 und 9 beträgt. Verknüpft werden dabei zwei Einzelbedingungen mit dem logischen Operator &&
. Die gesamte Bedingung ist in dem Fall nur dann wahr, wenn beide Einzelbedingungen wahr sind.
Für einfache Entweder-Oder-Bedingungen gibt es noch eine spezielle Syntax, die Sie alternativ zu if
und else
verwenden können.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Testausgabe</title>\n"; print "</head><body>\n"; my $Ergebnis = $ENV{'HTTP_USER_AGENT'} =~ /MSIE/ ? "den Internet Explorer" : "nicht den Internet Explorer"; print "<b>Sie benutzen $Ergebnis!</b>\n"; print "</body></html>\n";
Das Script ermittelt durch Bewerten der Umgebungsvariablen HTTP_USER_AGENT
mit Hilfe eines regulären Ausdrucks, ob der aufrufende Browser ein Internet Explorer ist oder nicht. Im HTML-Code steht dann entweder: "Sie benutzen den Internet Explorer" oder "Sie benutzen nicht den Internet Explorer".
Eine einfache Entweder-Oder-Abfrage wird mit einer Bedingung eingeleitet, im Beispiel $ENV{'HTTP_USER_AGENT'} =~ /MSIE/. Dabei ist /MSIE/
ein regulärer Ausdruck, und =~
ist ein spezieller Bindungsoperator für solche regulären Ausdrücke. Dahinter wird ein Fragezeichen notiert. Hinter dem Fragezeichen wird eine Anweisung notiert, die dann ausgeführt wird, wenn die Bedingung wahr ist. Dahinter folgt ein Doppelpunkt, und dahinter eine Anweisung für den Fall, dass die Bedingung nicht wahr ist. Im Beispiel bestehen die beiden Anweisungen lediglich in der Notation von Werten, die dem Skalar $Ergebnis
ganz links vor der Formulierung der Bedingung zugewiesen werden. Ebenso könnte an der Stelle aber auch stehen:
$ENV{'HTTP_USER_AGENT'} =~ /MSIE/ ? print "Sie benutzen den MS IE" : print "Sie benutzen nicht den MS IE";
.
Schleifen | |
Zahlen | |
SELFHTML/Navigationshilfen Perl Perl-Sprachelemente |
© 2005 Impressum