in reply to Ternary if versus normal if question

I expect the following code to behave the same whether using "normal" if or "ternary" ? : ; style if.

You seem to be confused. C<?:> is an operator, whereas if is a flow control syntactical keyword. While you can use the former instead of the latter:

(.5<rand) ? print "Wow\n" : die "horribly";
you really shouldn't. I may get heavily downvoted for saying that you "can", so I'll stress once more that you really really shouldn't. Except in golf and obfu, that is.

The point is that you should use C<?:> if you're interested in its return value. And of course you can't use if instead of it, because the latter does not return anything. You will rapidly learn in which situations it is worth to use one and in which ones it is worth to use the other...

Replies are listed 'Best First'.
Re^2: Ternary if versus normal if question
by tphyahoo (Vicar) on Nov 18, 2005 at 11:10 UTC
    Thanks very much to you and all those who clarified the ternary if to me. However, what is meant by the C in C<?:>? Is that shorthand for some concept?
      It's the pod format of Perl documentation. Apart that, it is also used in ASCII contexts to visually mark code, but I generally avoid it here since whe have <code> tags anyway. In this situation, however, it seemed to me to be too be too short and confusing, so I added that pseudo-markup.
Re^2: Ternary if versus normal if question
by GrandFather (Saint) on Nov 17, 2005 at 20:24 UTC

    Why shouldn't you? Perl idiom says that:

    (.5<rand) or die "horribly";

    is acceptable. In fact even encouraged. Can you explain to OP and others why your very compact and easily read example is so much worse than:

    if (.5<rand) { print "Wow\n"; } else { die "horribly"; }

    Granted, were the string in either case much bigger, or were more lines of code required than shown in either case, if starts to look much better. Even better however would be the or die idiom.

    However, this doesn't really apply to OP's context where $var = <cond> ? <case 1> : <case 2>; is ok and $var = ! $var; is much better.


    DWIM is Perl's answer to Gödel
      Why shouldn't you? Perl idiom says that:
      (.5<rand) or die "horribly";
      is acceptable. In fact even encouraged. Can you explain to OP and others why your very compact and easily read example is so much worse than:

      It is worse in that short circuiting or used in contexts like the one you're referring to makes for very clear syntax imitating its use in natural languages. Indeed the practical rule of a thumb is to use low-precedence logical operators for flow control and high-precedence ones to operate on values. Of course there are reasonable situations in which it is reasonable to violate this "rule", but in most cases it does apply.

      if (.5<rand) { print "Wow\n"; } else { die "horribly"; }

      To be fair I happen rarely enough to (have to) use a full if ... then ... else construct like the above. In this case, for example

      die "horribly" if .5 < rand; print "Wow\n";
      would suffice. Of course this is specific of the particular example under examination, but I make a frequent use of blocks (sometimes also for loops having the sole purpose of aliasing to $_) and of last, next, and more rarely redo and they make for quite as compact but still perfectly readable syntax.