B::Deparse thinks (and I expected) that parens have priority to capture function arguments and that
do('foo')->{'bar'};
is analogous to
(do 'foo') -> {bar}
but the weird parser rather sees
do ('foo' -> {bar})
see the difference in priority of parens around arguments by comparing print() vs do()
lanx@nc10-ubuntu:/tmp$ perl -MO=Concise, -e 'do ($foo)->{bar};' 9 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v:{ ->3 8 <1> dofile vK/1 ->9 # do file 7 <2> helem sK/2 ->8 # hash-elem returns fi +le 5 <1> rv2hv[t2] sKR/1 ->6 4 <1> rv2sv sKPM/DREFHV,1 ->5 3 <#> gv[*foo] s ->4 6 <$> const[PV "bar"] s/BARE ->7 -e syntax OK lanx@nc10-ubuntu:/tmp$ perl -MO=Concise, -e 'print ($foo)->{bar};' 9 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v:{ ->3 8 <2> helem vK/2 ->9 # hash-element 6 <1> rv2hv[t2] sKR/1 ->7 5 <@> print sK ->6 # print returns hashre +f 3 <0> pushmark s ->4 - <1> ex-rv2sv sK/1 ->5 4 <#> gvsv[*foo] s ->5 7 <$> const[PV "bar"] s/BARE ->8 -e syntax OK
just remember the common trap when people try writing something like
print (caller)[5]
$ perl -c -e 'print (caller)[5]' syntax error at -e line 1, near ")[" -e had compilation errors.
while
$ perl -c -e 'do (L,I,S,T)[5]' -e syntax OK
Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
In reply to Re: B::Deparse weirdness (parser weirdness!)
by LanX
in thread B::Deparse weirdness
by choroba
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |