Diese Seiten sind Teil von Bachsau’s Archiv.
Die hier beschriebenen Praktiken entsprechen nicht mehr dem Stand der Technik!
Bitte nutzen Sie für aktuelle Projekte das fortlaufend aktualisierte SELFHTML-Wiki.

SELFHTML

Bedingte Anweisungen

Informationsseite

nach unten Bedingte Anweisungen mit if, else und elsif
nach unten Bedingte Anweisungen mit unless
nach unten Nachgestellte Bedingungen
nach unten Einfache Entweder-Oder-Abfrage

 nach unten 

Bedingte Anweisungen mit if, else und elsif

Sie können die Ausführung von Anweisungen von Bedingungen abhängig machen.

Beispiel eines vollständigen CGI-Scripts:

#!/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 &uuml;bergeben!</b>\n";
}
elsif( length($ENV{QUERY_STRING}) < 4 ) {
 print "<b>&Uuml;bergebene Daten enthalten weniger als 4 Zeichen!</b>\n";
}
elsif( length($ENV{QUERY_STRING}) > 8 ) {
 print "<b>&Uuml;bergebe Daten enthalten mehr als 8 Zeichen!</b>\n";
}
else {
 print "<p><b>folgende Daten wurden dem Script &uuml;bergeben:</b><br> $ENV{QUERY_STRING}</p>";
 (my $String, my $Salt) = split(/\+/,$ENV{QUERY_STRING});
 my $CryptString = crypt($String,$Salt);
 print "<p><b>Verschl&uuml;sselt lauten die Daten:</b><br>$CryptString</p>\n";
}

print "</body></html>\n";

Erläuterung:

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 Seite 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 Seite 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 Seite 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 Seite 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 Seite 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.

Beachten Sie:

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 Seite JavaScript.

nach obennach unten

Bedingte Anweisungen mit unless

Bedingungen können auch andersherum formuliert werden.

Beispiel eines vollständigen CGI-Scripts:

#!/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";

Erläuterung:

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 Seite open und Seite close.

nach obennach unten

Nachgestellte Bedingungen

Um eine einzelne Anweisung abhängig von einer Bedingung auszuführen, erlaubt Perl auch eine besondere, etwas kürzere Form von Bedingungen.

Beispiel eines vollständigen CGI-Scripts:

#!/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";

Erläuterung:

Das Script ermittelt mit der Funktion Seite 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 Seite logischen Operator &&. Die gesamte Bedingung ist in dem Fall nur dann wahr, wenn beide Einzelbedingungen wahr sind.

nach obennach unten

Einfache Entweder-Oder-Abfrage

Für einfache Entweder-Oder-Bedingungen gibt es noch eine spezielle Syntax, die Sie alternativ zu if und else verwenden können.

Beispiel eines vollständigen CGI-Scripts:

#!/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";

Erläuterung:

Das Script ermittelt durch Bewerten der Umgebungsvariablen HTTP_USER_AGENT mit Hilfe eines Seite 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";.

 nach oben
weiter Seite Schleifen
zurück Seite Zahlen
 

© 2007 Seite Impressum

Originaladresse dieses Dokuments: http://de.selfhtml.org/perl/sprache/bedingt.htm