Matti Maekitalo: Einfacher Formmailer, Danke-Seite als .pl, mit "unbedingtem" if

Beitrag lesen

use Mosche;

Also das _if ($rc)_ ist mein Problem. Was passiert da?

In Perl ist jeder skalare Wert "true", der nicht 0 oder die leere
Zeichenkette ist.
(Hm, wie das mit undef ist, weiß ich gerade nicht auswendig.)

Also von 1 bis unendlich und a bis Z usw. (also strings z.B., jkhkhkh) ist alles true.
Na gut, ich komm auf Dich zurück! ;-)

Schau noch mal in mein "Erklärposting", da habe ich es erklärt:

Im logischen Kontext wird $rc folgend ausgewertet:

- Wenn $rc zu 1 ausgewertet wird (zB durch 1, 2, 'blah',
   aber Vorsicht: auch '000', da es ein String ist)
   ist die Bedingung wahr
 - Wenn $rc zu 0 ausgewertet wird (zB durch undef, 0, '')
   ist die Bedingung falsch.

$rc wird in dem if($rc) Kontext umgewandelt in entweder 1 oder 0 (wahr/falsch). falsch kommt immer dann, wenn $rc undef (der undefinierte Wert), 0 oder '' ist, ansonsten ist es wahr. Siehe dazu zB das Kapitel 4 in "Einführung in Perl" (O'Reilly).

Wenn Du also weißt, daß in $rc eine Zahl steht, dann ist
    if ($rc)
gleichbedeutend mit
    if ($rc != 0)

Wie kommt man darauf, dass
if ($rc)
gleichbedeutend mit
if ($rc != 0)
ist? Oder hat man das einfach festgelegt, oder ist das Mathematik? Hätt ich dann wohl verpasst in der Schule!

Das wird auf obige Definition von wahr/falsch zurückgeführt und ist, wie gesagt, nur richtig, wenn du weisst, dass in $rc nur Zahlen sind.

Die Änderung von $rc läßt sich übrigens aus der Abfrage herausziehen
und die Zuweisung der Farbe etwas abkürzen:

$color = ($rc ? '#CFCFCF' : '#EFEFEF');
    $rc    = 1 - $rc;

So kommt man dann völlig ohne explizites "if" aus.

Michael, für so etwas brauch ich noch etwas Bedenkzeit...so auf den ersten Blick...

Egentlich ganz einfach:
$color wird gesetzt auf:
 wenn $rc == 1 ist, auf '#CF-....'
 ansonsten auf '#EF....'
Wenn $rc in der nächsten Zeile den Wert 0 hat, wird es 1 (da 1-0==1)
wenn $rc in der nächsten Zeile den Wert 1 hat, wird es 0 (da 1-1==0)

use Tschoe qw(Matti);