http://www.perlmonks.org?node_id=1013961

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

 $a1=2; $b1=10; (defined($a1 > $b1)) ? ($int = ($a1/$b1)) : ($int = ($b1/$a1)); print $int;

wats wrong with this code?

Replies are listed 'Best First'.
Re: ternary operator
by tmharish (Friar) on Jan 18, 2013 at 06:55 UTC
    Short Answer:
    $a1=2; $b1=10; ($a1 > $b1) ? ($int = ($a1/$b1)) : ($int = ($b1/$a1)); +print $int;
    Better Short Answer:
    $a1=2; $b1=10; $int = ($a1 > $b1) ? ($a1/$b1) : ($b1/$a1); print $int;
    What it should really be:
    use strict ; use warnings ; # Use Better Variable Names. my $a1 = 2 ; my $b1 = 10 ; my $int = ( $a1 > $b1 ) ? ( $a1 / $b1 ) : ( $b1 / $a1 ) ; print $int;
    Reasoning:

    defined($int = ($a1/$b1)) will always evaluate to true regardless of the values of $a1 and $b1. If you want to check if both $a1 and $b1 are defined you might want to nest it in there like:
    my $int = ( defined( $a1 ) and defined( $b1 ) ) ? ( ( $a1 > $b1 ) ? ( +$a1 / $b1 ) : ( $b1 / $a1 ) ) : die( '$a1 and $b1 need to be defined' + ) ;
    The other thing to note is that the the Ternary Operator, being an Operator, will return something and so you dont need to do the $int = in both the if and else parts.
      Besides checking whether $a1 and $b1 are defined, you'd probably also want to verify that the the smaller value is != 0. By now, we are definitely at the point where insisting on using the ternary operator causes needless issues with readability.
Re: ternary operator
by davido (Cardinal) on Jan 18, 2013 at 06:54 UTC

    Obviously, it's not using strict. ;)


    Dave

Re: ternary operator
by BrowserUk (Patriarch) on Jan 18, 2013 at 06:44 UTC

    Everything!


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re: ternary operator
by AnomalousMonk (Archbishop) on Jan 18, 2013 at 09:39 UTC

    Not enough parentheses.