in reply to Complex conditional statements

What do "if" and "undef" mean? What's the relative precedence of "unless", "or" and "if"? If your snippet is equivalent to

if (not B) { A } else { if (E and F) { C and D } else { undef } }

it can be written as

(not B and A) or (B and ( ((E and F) and (C and D)) or (not (E and F) and undef) ))

and simplified (through logic arithmetic) to

(not B and A) or (B and E and F and C and D)

Notes:

For convertion to single expressions: if (A) { B } else { C } === (A and B) or (not A and C) For simplification: X and undef === undef X or undef === X

Replies are listed 'Best First'.
Re^2: Complex conditional statements
by bofh_of_oz (Hermit) on Jun 16, 2005 at 15:01 UTC
    A great explanation, thanks a lot!

    It raised another question, though: if one or more of those statements (A, B etc) is a print "..." statement, how can I make it print only if B is false (as in not B and A)?

     
    UPDATE: Here's how my test code looks:

    $test = $comment = 1; ($a = 3 and print "--> $a\n") if ($comment or $test) or print "no way! +\n";

    It works if ($comment or $test) gives true, but both print statements are executed if it gives false...

    --------------------------------
    An idea is not responsible for the people who believe in it...

      not B and print("...")

      Unlike C, every Perl function can be used in an expression, even those that don't normally return a value. But that's moot since print actually does return a value: true on success, false (and sets $!) otherwise.

      Keep in mind that using these techniques is almost guaranteed to make your code less readable or unreadable. For expressions of that magnitude, I encourage you to treat this discussion as an academic excercise.

      Update: Answer to Updated question:

      ($a = 3 and print "--> $a\n") if ($comment or $test) or print "no way!";
      is the same as
      ($a = 3 and print "--> $a\n") if ($comment or $test or print "no way!");
      Keep in mind that print pretty much always returns true, so the above doesn't do what you want. You could fix it by changing the return value of print:
      ($a = 3 and print "--> $a\n") if ($comment or $test) or (print("no way!"), 0);
      But that's aweful code! What's wrong with
      if ($comment or $test) { $a = 3; print "--> $a\n"; } else { print "no way!\n"; }
      You could shorten it a little to
      $comment or $test ? ( $a = 3, print "--> $a\n" ) : print "no way!\n";
      but you're starting to mess with people's ability to read your code if you do that.