In the first case consider what is happening:

(return something()) or (croak "Something didn't work.\n");

return will always return. Interestingly, it may return a false value (return 0; or return undef or return ''; or even return ()). But it will certainly return. Once it has returned, the subroutine is done. There's no way to ever reach the low precedence 'or'. It's like hanging up the phone before you ever hear the other party ask a question.

In the second example, it's like this:

return (something() || croak "Something didn't work.");

Now something() is evaluated, and if it is false, then the || evaluates the righthand side, which is the croak call. Croak throws an exception and consequently control is never handed to the return.

Before return can run, its arguments must be evaluated. In the first example its argument is something()'s return value. In the second example, the expression is the entire construct including the || croak.


Dave


In reply to Re: Possible precedence issue with control flow operator by davido
in thread Possible precedence issue with control flow operator by will_

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.