|
Kurs: Perl und CGI |
|
|
3.1.2 Bedingte AnweisungenBedingte Anweisungen in Perl weisen eine der folgenden Strukturen auf:
if (AUSDRUCK) BLOCK
if (AUSDRUCK) BLOCK else BLOCK
if (AUSDRUCK) BLOCK elsif (AUSDRUCK) BLOCK ... else BLOCK
Bedingte Anweisungen werten erst eine Bedingung (einen Ausdruck in booleschem Kontext) aus. Ist das Ergebnis true, dann wird ein Block ausgeführt. Ist das Ergebnis false, dann wird
Es gibt in Perl verschiedene Möglichkeiten, Anweisungen abhängig von bestimmten Bedingungen auszuführen. Die erste Gruppe von bedingten Anweisungen folgt dem C-Stil (der auch in Java verwendet wird):
my $x = rand 100; # Zufallszahl < 100
# if elsif else
if ( $x < 20 ) { print "klein"; }
elsif ( $x < 50 ) { print "mittel"; }
elsif ( $x < 80 ) { print "gross"; }
else { print "sehr gross"; }
# unless bedeutet if not
unless ( $x > 50 ) { print "klein"; }
else { print "gross"; }
Die elsif-Zweige sind optional, der else-Zweig ebenfalls. Achtung: Auch wenn es unglaublich klingt, so ist Perl bei den bedingten Anweisungen strenger als C oder Java. Nach if, elsif, else oder unless darf keine einfache Anweisung stehen, sondern es muss immer ein Block mit geschweiften Klammern kommen. Dies macht die Zuordnung bei geschachtelten bedingten Anweisungen einfach und die Programme weniger fehleranfällig. Neben dieser C-Variante gibt es noch eine umgangssprachliche Variante, das heißt, Programmkonstrukte, die flüssiger zu lesen sind, zumindest wenn Sie englisch programmieren. Perl kennt das Konzept von sogenannten Modifiern, die hinter einer einfachen Anweisung stehen können, und vor der Anweisung ausgewertet werden. Das folgende Beispiel zeigt die Verwendung von Modifiern:
# ab 50 beginnen die grossen Zahlen
print "gross" unless rand 100 < 50;
# wenn Sie sichergehen moechten, benuetzen Sie Klammern
print "gross" unless rand(100) < 50;
# kiss sei eine Subroutine mit Seiteneffekten
do { kiss("me"); } if $you_love_me;
# die ist eine Perl-Funktion, die das Programm beendet
die "Liebeskummer" if $you_leave_me;
Perl unterstützt die folgenden Modifier:
if AUSDRUCK
unless AUSDRUCK
while AUSDRUCK
until AUSDRUCK
foreach AUSDRUCK
Um die Vielzahl der Ausdrucksmöglichkeiten in Perl noch zu erweitern, können auch die logischen Operatoren and, &&, or oder || verwendet werden. Wie in Lerneinheit 2 beschrieben, wirken sie als Short-Circuit-Operatoren, das heißt, sie evaluieren erst die linke Seite im booleschen Kontext. Nur wenn nach Auswertung der linken Seite der Wert des Ausdrucks noch nicht feststeht, wird auch die rechte Seite evaluiert. Auf diese Weise kann man zum Beispiel Fehlermeldungen sehr elegant programmieren:
# falls das File nicht geoeffnet werden kann
my $file = "titel.html";
open FH, $file or die "Fehler beim Oeffnen von $file: $!";
# liest sich nicht mehr ganz so fluessig
$you_love_me or die "Liebeskummer";
Zum Schluss programmieren wir ein kleines Spiel. Sie würfeln auf Ihrer Webseite eine Zahl zwischen 1 und 100. Der Benutzer muss durch Raten diese Zahl herausfinden, wobei die Anzahl der Versuche gezählt wird. Als Antwort erhält er jedesmal die Meldung "zu klein", "zu groß" oder "getroffen". Das Kernstück des Programms sind verschachtelte bedingte Anweisungen, in denen die verschiedenen Fälle
unterschieden werden:
unless ( $action eq "neuer Versuch" ) {
# wir muessen ein neues Spiel erzeugen
$rate = int(rand 100) + 1; # neue Zufallszahl
$text = "";
$action = "neuer Versuch";
$versuche = 0;
}
else {
$versuche++;
if ( $zahl > $rate ) {
$text = "$zahl ist zu gross!";
}
elsif ( $zahl < $rate ) {
$text = "$zahl ist zu klein!";
}
else {
$text = "Gratuliere, die gesuchte Zahl war $zahl";
$aufforderung = "";
$action = "neues Spiel";
}
}
Der Rest besteht nur noch aus dem Einlesen der CGI-Parameter und der Erstellung des HTML-Codes.
001: #!E:\Perl\bin\Perl.exe
002:
003: ########################################################################
004: # ratespiel.pl
005: # eine Zahl zwischen 1 und hundert muss
006: # mit moeglichst wenig Versuchen geraten werden
007: ########################################################################
008:
009: use strict; # alle Variablen muessen vereinbart werden
010: use CGI qw(:standard); # benutzt das Modul CGI
011: $\ = "\n"; # Trennzeichen fuer print
012:
013: my $rate; # diese Zahl muss erraten werden
014: my $zahl; # diese Zahl wurde eingegeben
015: my $versuche; # Anzahl der bisherigen Versuche
016: my $text; # Ausgabetext
017: my $aufforderung; # soll etwas gemacht werden?
018: my $aktion; # was steht auf dem Abschick-Button?
019:
020: ########################################################################
021: # CGI-Parameter einlesen
022: ########################################################################
023:
024: $zahl = param("zahl");
025: $versuche = param("versuche");
026: $rate = param("rate");
027: $aktion = param("aktion");
028:
029: ########################################################################
030: # Ausgabetext bestimmen
031: ########################################################################
032:
033: $aufforderung = "bitte geben Sie einen Wert zwischen 1 und 100 ein:";
034:
035: unless ( $aktion eq "neuer Versuch" ) {
036: # wir muessen ein neues Spiel erzeugen
037: $rate = int(rand 100) + 1; # neue Zufallszahl
038: $text = "";
039: $aktion = "neuer Versuch";
040: $versuche = 0;
041: }
042: else {
043: $versuche++;
044: if ( $zahl > $rate ) {
045: $text = "$zahl ist zu gross!";
046: }
047: elsif ( $zahl < $rate ) {
048: $text = "$zahl ist zu klein!";
049: }
050: else {
051: $text = "Gratuliere, die gesuchte Zahl war $zahl";
052: $aufforderung = "";
053: $aktion = "neues Spiel";
054: }
055: }
056:
057: ########################################################################
058: # HTML-Code erzeugen
059: ########################################################################
060:
061: print <<END;
062: Content-type: text/html
063:
064: <html>
065: <head><title>Ratespiel</title></head>
066: <body bgcolor="#88ccff">
067: <h1>Ratespiel</h1>
068: <hr>
069: <form method="post" action="/cgi-bin/puc/ratespiel.pl">
070: <input type="hidden" name="rate" value="$rate">
071: <p>$text</p>
072: END
073:
074: if ( $aufforderung ) {
075: print qq(<p>$aufforderung <input type="text");
076: print qq(name="zahl" size="3"></p>);
077: }
078:
079: print <<END;
080: <p>Sie hatten bisher
081: <input type="text" name="versuche" value="$versuche" size="3" "readonly">
082: Versuche<p>
083: <p><input type="submit" name="aktion" value="$aktion"></p>
084: </form>
085: </body>
086: </html>
087: END
CGI-Skript ratespiel.pl Das Interessante an der HTML-Form ist das verstecke Eingabefeld:
<input type="hidden" name="rate" value="$rate">
Mit diesem Feld kann ein Wert (die zu erratende Zahl) an das CGI-Skript weitergeleitet werden, ohne dass die Zahl auf dem Bildschirm erscheint (sonst wäre das Spiel etwas langweilig). Versteckte Felder in HTML-Formularen werden wir später noch ausführlich behandeln. Das Ergebnis sieht so aus:
|
| Kurs: Perl und CGI |