Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^6: Short form (ternary) if else

by Riales (Hermit)
on Feb 08, 2012 at 23:20 UTC ( #952621=note: print w/ replies, xml ) Need Help??


in reply to Re^5: Short form (ternary) if else
in thread Short form (ternary) if else

I'm surprised by this result:

ken@ganymede: ~/tmp $ perl -Mstrict -Mwarnings -E 'my $x; 1 ? $x=1 : $x=0; say $x;' 0
Do you know why $x becomes 0?


Comment on Re^6: Short form (ternary) if else
Select or Download Code
Re^7: Short form (ternary) if else
by wrog (Monk) on Feb 08, 2012 at 23:32 UTC
    operator precedence; ? : binds tighter than =. So

    1 ? $x=1 : $x=0

    really means

    (1 ? $x=1 : $x)=0

    which is then the same as

    ($x=1)=0

    which is why $x becomes 0.
    You can use assignments within ? :, you just need to parenthesize them

    1 ? $x=1 : ($x=0)

      Ah, perfect explanation. I knew it had something to do with operator precedence but I just couldn't work out quite where it was happening. Thank you, good sir!
Re^7: Short form (ternary) if else
by kcott (Abbot) on Feb 08, 2012 at 23:59 UTC

    Adding parentheses to the second statement to show precedence, we get:

    ( 1 ? ( $x=1 ) : $x ) = 0;

    As the 2nd and 3rd arguments are lvalues, you can assign to the ternary operator. As the first argument (1) is TRUE, the assignment becomes:

    ( $x=1 ) = 0;

    Which effectively boils down to:

    $ perl -Mstrict -Mwarnings -E 'my $x; ($x = 1) = 0; say $x;' 0

    The link I gave above (perlop manpage - under Conditional Operator) has a fuller description.

    -- Ken

      Thanks all! I got my question answered and then some. Good discussion.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://952621]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (10)
As of 2014-09-23 12:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (220 votes), past polls