SELFHTML: Perl / Perl-Sprachelemente / Bedingte Anweisungen
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Wie Sie in Perl das Ausführen von Anweisungen von Bedingungen abhängig machen können.
Keywords: SELFHTML, Perl, if, elsif, else, unless, Bedingung
Date: 2005-11-09T00:29:27+01:00

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

## 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:

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

## Bedingte Anweisungen mit unless

Bedingungen können auch andersherum formuliert werden.

### Beispiel eines vollständigen CGI-Scripts:

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";

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

## 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:

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";

### Erläuterung:

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.

## 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:

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";

### Erläuterung:

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

© 2007 Impressum