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

      I wasn't even trying to guess what it would really parse as so I just Deparse and run it

      $ perl -MO=Deparse print (two + two == five ? "true" : "false") ^Z print two 'two' == 'five' ? 'true' : 'false'; - syntax OK $ perl -MO=Deparse,-p print (two + two == five ? "true" : "false") ^Z print(two (('two' == 'five') ? 'true' : 'false')); - syntax OK $ perl -w print (two + two == five ? "true" : "false") print (...) interpreted as function at - line 1. Unquoted string "two" may clash with future reserved word at - line 1. Unquoted string "two" may clash with future reserved word at - line 1. Unquoted string "five" may clash with future reserved word at - line 1 +. ^Z Name "main::two" used only once: possible typo at - line 1. Argument "five" isn't numeric in numeric eq (==) at - line 1. Argument "two" isn't numeric in numeric eq (==) at - line 1. print() on unopened filehandle two at - line 1.
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?