in reply to Re: Complex conditional statements
in thread Complex conditional statements

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...

Replies are listed 'Best First'.
Re^3: Complex conditional statements
by ikegami (Patriarch) on Jun 16, 2005 at 15:12 UTC

    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.