cgicorner.ch

Informationen rund um Perl/CGI

Sie sind hier: Home > CGI Hilfe > Tutorial > Kapitel 5 - Bedingungen

Tutorial - Kapitel 5: if...else und unless

Voraussetzungen für dieses Kapitel

  • Webserver mit Perl/CGI-Unterstützung

Einleitung

Wir sind jetzt mit dem Aufbau eines Perl-Scripts vertraut und können auch mit Variablen, Arrays und Hashes umgehen. Jetzt können wir uns - endlich - einmal mit den wichtigsten Befehlen vertraut machen und dann mit dem programmieren so wirklich beginnen. Anfangen möchte ich mit der IF-Abfrage...

Die IF-Abfrage

Die IF-Abfrage ist die einfachste Art einer Abfrage und macht eigentlich nichts anderes als sich eine Frage zu stellen: Ist die Bedingung erfüllt? Wenn ja: mach etwas. Schauen wir das einmal in einem Script (if.cgi) an...

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$meineZahl=50;
print "<html><body>";
if ($meineZahl > 30) {
  print "Die eingegebene Zahl ($meineZahl) ist grösser als 30!";
}
print "</body></html>";

Was passiert? Zuerst definieren wir eine Variable $meineZahl mit dem Wert 50. Daraufhin machen wir eine IF-Abfrage und prüfen, ob $meineZahl grösser als 30 ist: ($meineZahl > 30). Ist dies der Fall, werden alle Anweisungen zwischen den geschweiften Klammern ({ }) ausgeführt. Wenn nicht werden diese Anweisungen ausgelassen.

Versuchen Sie es einmal und nehmen Sie auch einmal eine Zahl unter 30. Weisen Sie der Variable einen Text zu, so wird der Text auch nicht erscheinen (Text = 0 = <30).

Der Aufbau einer IF-Abfrage sieht also wie folgt aus:

if (Bedingung) {
  eine oder mehrere Anweisungen, die ausgeführt werden sollen, wenn Bedingung wahr ist
}

Es gibt verschiedene Abfrage-Möglichkeiten:

> linker Teil ist grösser als der rechte Teil, z.B. 50 > 30
>= linker Teil ist grösser oder gleich der rechte Teil, z.B. 50 >= 30, aber auch 30 >= 30
< linker Teil ist kleiner als der rechte Teil, z.B. 10 < 70
<= linker Teil ist kleiner oder gleich der rechte Teil, z.B. 10 <= 70 aber auch 10 <= 10
== linker und rechter Teil sind identisch, z.B. 60 == 60
!= linker und rechter Teil sind nicht identisch, z.B. 75 != 40
> linker Teil ist grösser als der rechte Teil, z.B. 50 > 30

Wichtig: Dies ist eine häufige Fehlerquelle: die oberen Vergleiche sind numerisch! Aus diesem Grund ist die Aussage ("abc" == "def") WAHR, weil die Texte auch hier als "0" interpretiert werden, also (0 == 0), was natürlich stimmt. Auch die Aussage (03 == 3) ist natürlich wahr, da bei Zahlen führende Nullen keinen Einfluss auf den Wert haben.

Wenn es also numerische Vergleiche gibt, gibt es sicher auch etwas für Texte, oder? Natürlich:

eq linker Text entspricht (equals) rechtem Text, z.B. "abc" eq "abc"
ne linker Text entspricht nicht (not equals) dem rechten Text, z.B. "abc" ne "def"
gt linker Text ist grösser als (greater than) rechter Text. Verglichen wird mit den ASCII-Codes. Wird in der Praxis jedoch selten gebraucht... Beispiel: "Z" gt "A", "\" gt "@" ("\" hat den ASCII-Code 92, @ hingegen nur 64); aber "a" gt "Z" (ein kleines "a" hat den ASCII-Code 97, das grosse "Z" jedoch nur den Code 90
!= linker Text ist kleiner als (less than) rechter Text. Beispiele siehe oben, jedoch vertauscht.

Wichtig: Diese Abfragen sind alphanumerisch, es ist jetzt korrekt, dass ("abc" ne "def") ist, jedoch ist auch ("03" ne "3"), da diese zwar numerisch gesehen den gleichen Wert haben, als Text jedoch nicht identisch sind.

Es ist also wichtig, dass man sich immer überlegt, ob man zwei Werte nun numerisch oder alphanumerisch vergleichen möchte. Wie gesagt, ist dies in der Praxis eine häufige Fehlerquelle...

Perl kann Übrigens noch viel mehr, als einfach zwei Texte oder Zahlen zu vergleichen: die Regular Expressions. Diese leistungsfähigen Abfragen sind DIE Stärke von Perl. Dies schauen wir jedoch erst in einem späteren Kapitel an, wenn wir Perl etwas besser beherrschen...

IF-Abfragen mit nur einer einzigen Anweisung können auch verkürzt dargestellt werden, indem die IF-Abfrage an das Ende der Zeile (vor dem Strichpunkt) gesetzt wird:

print "$zahl ist grösser als 30" if ($zahl > 30);

if...else Abfrage

Wenn Sie die IF-Abfrage verstanden haben, ist die IF...ELSE-Abfrage eine Kleinigkeit für Sie. Der einzige Unterschied liegt darin, dass es noch möglich ist, SONST-Anweisungen auszuführen. Auch hier ein Beispiel (if_else.cgi), dann ist es schnell klar:

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$meineZahl=50;
print "<html><body>";
if ($meineZahl > 30) {
  print "Die eingegebene Zahl ($meineZahl) ist grösser als 30!";
} else {
  print "Die eingegebene Zahl ($meineZahl) ist kleiner oder gleich 30!";
}
print "</body></html>";

Wir hängen also einfach am Ende der IF-Abfrage noch ein else { } an und können hier Anweisungen hinschreiben, die ausgeführt werden sollen, wenn die Bedingung nicht wahr ist:

if (Bedingung) {
  DANN-Anweisungen (Bedingung wahr)
} else {
  SONST-Anweisungen (Bedingung nicht wahr)
}

Verstanden? Dann erweitern wir die IF-Abfrage doch nochmals...

if...elsif...else-Abfrage

Dies ist nochmals eine Erweiterung der IF-Abfrage: Ist Bedingung1 wahr? Ja: Anweisungen1. Nein: Ist Bedingung2 wahr? Ja: Anweisungen2. Auch nicht? Anweisungen3. Als Code (elsif.cgi):

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$meineZahl=50;
print "<html><body>";
if ($meineZahl > 30) {
  print "Die eingegebene Zahl ($meineZahl) ist grösser als 30!";
} elsif ($meineZahl == 30) {
  print "Die eingegebene Zahl ist gleich 30!";
} else {
  print "Die eingegebene Zahl ($meineZahl) ist kleiner als 30!";
}
print "</body></html>";

Nochmals in reiner Textform:

if (Bedingung) {
  DANN-Anweisungen (Bedingung wahr)
} elsif (Bedingung2) {
  DANN-Anweisungen für Bedingung2 (Bedingung2 wahr)
} else {
  SONST-Anweisungen (Bedingung sowie Bedingung2 nicht wahr)
}

unless

unless ist ein etwas gewöhnungsbedürftiger Befehl, der den Code nicht gerade sehr übersichtlich macht, trotzdem ist er mir ans Herz gewachsen. Deshalb möchte ich ihn hier auch noch kurz erklären. unless ist nicht anderes als eine AUSSER-Abfrage, die hinter einen Befehl gestellt werden kann. Beispiel gefällig (unless.cgi)?

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$meineZahl=50;
print "<html><body>";
print "Die eingegebene Zahl ist kleiner als 30" unless ($meineZahl >= 30);
print "</body></html>";

Der print-Befehl ausgeführt, AUSSER die Bedingung ($meineZahl >= 30) ist wahr. Wie schon erwähnt eine sehr kompakte Schreibweise um mal einen Befehl auszulassen, dient jedoch nicht gerade der Übersichtlichkeit... Wie Sie auch gesehen haben, wird die unless-Bedingung hinter eine Anweisung, vor dem Strichpunkt eingefügt.

Zusammenfassung

Nach diesem Kapitel beherrschen wir die IF-, IF...ELSE- sowie die IF...ELSIF...ELSE-Abfrage. Wir wissen auch, wie wir Zahlen und Texte miteinander vergleichen können und kennen die Fehlerquelle mit den verwechselten numerischen- und alphanumerischen Abfragen (z.B. "==" statt "eq"). Ebenfalls haben wir den unless-Befehl ganz kurz angeschaut.

Wie geht's weiter?

Kapitel 6 beschäftigt sich mit den verschiedenen Schleifen unter Perl.

Im vorherigen Kapitel (4) beschäftigten wir uns mit Arrays uns Hashes.

Sie können aber auch zurück zum Inhaltsverzeichnis und dort ein beliebiges anderes Kapitel auswählen.