Michael Schröpl: Einfacher Formmailer, Danke-Seite als .pl, mit "unbedingtem" if

Beitrag lesen

Hi Thomas,

Nur, lieber Michael mein Problem war ja, das eben
keine Bedingung da war, sondern nur if ($rc)
dastand,

ich wiederhole: Eine Bedingung ist ein Ausdruck.

Der kann auch nur alleine aus einer Variablen oder
Konstanten bestehen (z. B. "if (1)") - wichtig ist
nur, welchen Wert dieser Ausdruck liefert.
Der Ausdruck _kann_ Vergleichsoperatoren enthalten,
muß aber nicht.
Auch (2+2) kann eine Bedingung sein (welche nun in der
Tat einen Operator enthält ...), denn 4 ist im Kontext
einer logischen Auswertung in Perl "true".

drum heisst das Subjekt dieses Threads ja auch
(mit "unbedingtem" if)!

Es gibt aber kein "unbedingtes" "if" in Perl, weil das,
was direkt dahinter steht, eben die Bedingung ist -
auch wenn diese "ungewöhnlich" aussehen kann.

Der Zweck des "if" ist eben gerade die Verzweigung in
Abhängigkeit vom Wert der Bedingung.

was hinter dem "if" bei DIR steht, weiss ich jetzt
nicht genau. Steht da jetzt eine Bedingung wie diese
($rc == 0), oder steht da nur if ($rc)?

Beides wären legale Bedingungen. An dieser Stelle darf
alles stehen, was einen (skalaren) Wert liefert.
(Beispielsweise dürfte sogar eine nichtskalare Varia-
ble, etwa ein Array, dort stehen, weil er im _skalaren_
Kontext einen skalaren Wert liefert, nämlich die Anzahl
der in ihm enthaltenen Elemente ...)

ich les grad das Posting vor dem Absenden nochmals
durch, ($rc) ist ja selbst die Bedingung, oder?

Genauuuuu ...

Stop mal, ist der Kontext die Klammer, einmal die
Bedingung!?

Für das "if" ist die Klammer _samt_ deren Inhalt die
Bedingung; für den Inhalt der Klammer ist die Klammer
deren Kontext.

Meinst Du, dass so?: Im Kontext der Klammer, lautet
die Bedingung, den Wert auf "wahr" oder "falsch"
abzubilden."

Der Kontext der Klammer nach dem "if" bewirkt, daß
der Wert des Inhalts der Klammer als Bedingung inter-
pretiert, d. h. auf "wahr" oder "falsch" abgebildet
werden muß. In anderen Kontexten als Bedingungen gibt
es wiederum andere Auswertungsvorschriften.

Und würde das heissen, dass "if ($rc)" - soweit
waren wir aber glaub ich schon - also die Anweisung
"if" durch die Klammern einen Kontext zur Bedingung
bekommt. Die Bedingung frägt: "$rc, bist Du wahr,
oder unwahr?" Worauf $rc vielleicht stolz antwortet:
"Ich bin wahr!"

Yep.

Aber somit wäre die Klammer, die ja eigentlich nur
den Kontext für eine Bedingung zur Verfügung stellen
sollte, selbst zur Bedingung mutiert, das stört
mich. Ob die Variable mal Strings enthält, oder
Zahlenwerte, sind doch peanuts. ;-)

Es gibt andere Programmiersprachen, bei denen der Aus-
druck hinter dem "if" nicht geklammert werden muß
(PASCAL beispielsweise). Dort würde ich dann sagen,
der Kontext des Ausdrucks wird alleine durch seine
Stellung direkt nach dem "if" gebildet.

Im Fall von Perl wird der Kontext durch die
_Kombination_ aus den Klammern _und_ dieser Stellung
nach dem "if" gebildet - den an anderen Positionen
bedeutet die runde Klammer wiederum andere Dinge
(beispielsweise einen Listen-Kontext).

Sind doch Problemen, die ich gar nicht hatte. :-)

Das kommt alles noch.
Die runde Klammer in Perl ist ein "überladener Ope-
rator", der in verschiedenen Situationen unterschied-
liche Bedeutungen hat.
So, wie in anderen Sprachen das "+"-Zeichen ein über-
ladener Operator ist, der beispielsweise Zahlen ad-
diert, aber Strings zusammenfügt ...

Wenn Du einen String als Bedingung auswertest,
Redest Du jetzt davon ($rc)? Eine Bedingung ist für
mich ein Operator.

Oben habe ich versucht, Dir zu erklären, daß der Ein-satz von Operatoren eben nur ein Spezialfall einer
Bedingung ist. Da eine Bedingung ein Ausdruck ist und
ein Ausdruck zwar Operatoren enthalten kann, aber nicht
muß, gibt es auch Bedingungen ohne Operatoren.

Warum sagt das keiner? Sind Klammern  "()" nun
schon Operatoren? Aber doch nur Präzedenz-
Operatoren, oder?

In bestimmten Fällen sind die runden Klammern tat-
sächlich auch Operatoren - beispielsweise bilden sie
im Fall von "(1, 2)" die beiden Skalare "1" und "2"
so ab, daß als Ergebnis eine Liste mit zwei Elementen
entsteht.

Also jetzt bin ich etwas durcheinander, Operatoren
waren für mich vorrangig die VergleichsOperatoren

Lies "perdoc perlop" - es gibt in Perl sehr viele und
vor allem auch sehr ungewöhnliche Operatoren.

Beispielsweise liest man in allen mir sonst bekannten
Sprachen aus einer Datei, in dem man eine Funktion
dazu aufruft ... nicht aber in Perl, wo es dafür einen
eigenen Operator gibt.

Es gibt sogar Operatoren, die selbst fast wie Kontroll-
strukturen funktionieren. Einen davon habe ich Dir
vorgeführt: Die bedingte Zuweisung

$variable = ($bedingung ? $wert1 : $wert2),

was eine alternative (Kurz-)Schreibweise für

if ($bedingung)
          {$variable=$wert1}
     else {$variable=$wert2}

ist.

und eine ordentliche if, ja wie nenn ich das Ding
jetzt? If-Kontrollstruktur!

Sehr gut. "Anweisung" würde auch passen, aber "Kon-
trollstruktur" bezeichnet genauer, daß das "if" die
Kontrolle über den Programmfluß ausübt, also dafür
sorgt, daß bestimmte _andere_ Anweisungen ausgeführt
werden oder auch nicht.

So eine Art? Michael, les mal "Einführung in Perl"
(O'Reilly) S. 35. :-)

Besitze ich nicht ...

Viele Grüße
      Michael