Without testing first, guess what this program will print:
print (two + two == five ? "true" : "false")
Then figure out why you were wrong. (Please mark spoilers accordingly.)

Replies are listed 'Best First'.
Re: Tiny Perl puzzle
by tobyink (Canon) on Jun 05, 2014 at 22:19 UTC

    I realised fairly quickly that the plus would be treated as a unary operator, and thus assumed the whole thing would be effectively:

    print two( 0==0 ? "true" : "false" );

    ... and thus Perl would die because there's no function two() defined.

    But how foolish of me!! The first two becomes a file handle of course, albeit an unopened one. So the whole line ends up printing to nowhere.

    Good puzzle. This sort of thing is precisely the reason various best practices have arisen.

    use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name
Re: Tiny Perl puzzle (duh)
by tye (Sage) on Jun 06, 2014 at 00:22 UTC

    This surprises any even moderately experienced Perl programmer?

    Update: It appears that my test didn't sufficiently accurately replicate the original program text. Though I admit this particular quirk didn't and doesn't bother me much as I avoid barewords exactly because they lead to lots of ambiguities.

    - tye        

Re: Tiny Perl puzzle
by LanX (Saint) on Jun 06, 2014 at 00:35 UTC
    not sure about the precedence my first guess is "true" my second 1

    Can't test ATM :)

    Cheers Rolf

    (addicted to the Perl Programming Language)

    update

    tobyinc's analysis is correct! :)

    one more reason to enforce use strict and 'warnings'...

        I think B::Deparse gets it wrong -- as it sometimes does -- when you add -p:

        My theory: When Deparse tries to add parens wherever it can, it treats the first two as a function call (which was my first guess too). But as tobyink correctly surmised, that first two is treated by print as a filehandle.

        This is confirmed by the more low-level output of B::Concise:


        Dave

Re: Tiny Perl puzzle
by locked_user sundialsvc4 (Abbot) on Jun 06, 2014 at 12:09 UTC
    print (two + two == five) ? ( user == politician) ? "Re-elect me and I will fix it." : "It's not a bug, it's a feature!" : (user == accountant) ? "What do you -want- the answer to be?" : "Don't worry, sonny, no child will be left behind.™" ;
      Another incorrect Perl puzzle?

      (hint: print greedily loves brackets! :)

      Cheers Rolf

      (addicted to the Perl Programming Language)

      (Please mark spoilers accordingly.)

      sundialsvc4, why not honor the OPs request and use spoiler tags?