in reply to Re^2: Tiny Perl puzzle
in thread Tiny Perl puzzle
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:
$ perl -MO=Concise,-exec, -e 'print ( two + two == five ? "true" : "fa +lse" )' 1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{ 3 <0> pushmark s 4 <$> gv(*two) s 5 <1> rv2gv sKR/1 6 <$> const(PV "two") s/BARE 7 <$> const(PV "five") s/BARE 8 <2> eq sK/2 9 <|> cond_expr(other->a) lK/1 a <$> const(PV "true") s goto b d <$> const(PV "false") s b <@> print vKS c <@> leave[1 ref] vKP/REFC -e syntax OK
It's easy to see from this output that the first two is treated as a typeglob; a filehandle. The second two and the five are treated as barewords; constants in this case, which are then compared to one another. They evaluate to the same constant defined value, which is probably an empty string, equating to 0 for the purpose of numeric equality. So "true" will result, but it's printed to a filehandle that hasn't been attached to anything.
Dave
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Tiny Perl puzzle
by Anonymous Monk on Jun 07, 2014 at 07:25 UTC | |
|
Re^4: Tiny Perl puzzle
by LanX (Saint) on Jun 07, 2014 at 15:38 UTC | |
by Anonymous Monk on Jun 08, 2014 at 09:17 UTC | |
by LanX (Saint) on Jun 08, 2014 at 13:33 UTC |