in reply to Tiny Perl puzzle

Can't test ATM :)

Cheers Rolf

(addicted to the Perl Programming Language)

update

Replies are listed 'Best First'.
Re^2: Tiny Perl puzzle
by Anonymous Monk on Jun 06, 2014 at 01:16 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.

        Look at the way Deparse uses whitespace, its subtle

        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.

        That is not the way I read it :) Usually, Deparse doesn't add extraneous space to function calls, its always "foo( ... )" its never "foo ( ... )"

        so the way I read that deparse output is as filehandle not function call

        For example

        $ perl -MO=Deparse 2 sub two { rand; } print two(two() == 'five' ? 'true' : 'false'); 2 syntax OK $ perl -MO=Deparse,-p 2 sub two { (rand); } print(two(((two() == 'five') ? 'true' : 'false'))); 2 syntax OK

        When I look at Re^2: Tiny Perl puzzle I see  print( filehandle ... );