Perl/Bedingte Anweisungen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Bedingte Anweisungen mit if, else und elsif

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

Beispiel
#!/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 &amp;uuml;bergeben!</b>\n";
}
elsif( length($ENV{QUERY_STRING}) < 4 ) {
 print "<b>&amp;Uuml;bergebene Daten enthalten weniger als 4 Zeichen!</b>\n";
}
elsif( length($ENV{QUERY_STRING}) > 8 ) {
 print "<b>&amp;Uuml;bergebe Daten enthalten mehr als 8 Zeichen!</b>\n";
}
else {
 print "<p><b>folgende Daten wurden dem Script &amp;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&amp;uuml;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.
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 JavaScript.

[Bearbeiten] Bedingte Anweisungen mit unless

Bedingungen können auch andersherum formuliert werden.

Beispiel
#!/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") 
    or die("File not found $!");
 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.

[Bearbeiten] 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
#!/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 &amp;&amp; $Stunden < 10 );
print "<h1>Guten Tag!</h1>" if ( $Stunden > 9 &amp;&amp; $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.

[Bearbeiten] 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
#!/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";
 
#Beispiel 1
my $Ergebnis = $ENV{'HTTP_USER_AGENT'} =~ /\bMSIE\b/ ? "den Internet Explorer" : "einen anderen Browser";
 
print "<p>Sie benutzen ", $Ergebnis, "</p>\n";
 
#Beispiel 2
print "<p>Sie benutzen ",
   ( $ENV{'HTTP_USER_AGENT'} =~ /\bMSIE\b/ 
       ? "den Internet Explorer" 
       : "einen anderen Browser"
   ), "</p>\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 einen anderen Browser".

Beispiel 1

Eine einfache Entweder-Oder-Abfrage wird mit einer Bedingung eingeleitet, im Beispiel $ENV{'HTTP_USER_AGENT'} =~ /\bMSIE\b/. Dabei ist /\bMSIE\b/ 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.

Beispiel 2

Hier wird gezeigt, wie Sie durch eine zusätzliche Klammer eine Abfrage in einer Print-Anweisung ohne unnötige Variable durchführen können.
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML