El módulo B::Concise permite obtener información del árbol de operaciones.
$ perl -MO=Concise -e '$x = 4' 6 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v ->3 5 <2> sassign vKS/2 ->6 3 <$> const[IV 4] s ->4 - <1> ex-rv2sv sKRM*/1 ->5 4 <#> gvsv[*x] s ->5 -e syntax OKCada línea contiene cinco partes:
@
hace alusión a listas, un 2 indica que es un nodo binario,
un 1 que es unario, $
a escalares, etc.
v
es void
K
tiene hijos
REFC
indica que este operador usa el contador de referencias
Las operaciones que han sido optimizadas aparecen como ex-...
Los argumentos que no comienzan por un guión se interpretan como el nombre de la subrutina cuyos OPs se desean conocer. Por ejemplo, dado el programa:
%lhp@nereida:~/Lperl/src/perl_hacks_examples/know_thy_code/find_all_global_variables$ cat -n wear_bunny_costume.pl $ cat -n wear_bunny_costume.pl 1 use vars qw( $frog $toad ); 2 3 sub wear_bunny_costume 4 { 5 my $bunny = shift; 6 $frog = $bunny; 7 print "\$bunny is $bunny\n\$frog is $frog\n\$toad is $toad"; 8 }la llamada con argumento
wear_bunny_costume
muestra los OPs de esa subrutina:
$ perl -MO=Concise,wear_bunny_costume wear_bunny_costume.pl main::wear_bunny_costume: p <1> leavesub[1 ref] K/REFC,1 ->(end) - <@> lineseq KP ->p 1 <;> nextstate(main 35 wear_bunny_costume.pl:5) v ->2 6 <2> sassign vKS/2 ->7 4 <1> shift sK/1 ->5 3 <1> rv2av[t3] sKRM/1 ->4 2 <#> gv[*_] s ->3 5 <0> padsv[$bunny:35,36] sRM*/LVINTRO ->6 7 <;> nextstate(main 36 wear_bunny_costume.pl:6) v ->8 a <2> sassign vKS/2 ->b 8 <0> padsv[$bunny:35,36] s ->9 - <1> ex-rv2sv sKRM*/1 ->a 9 <#> gvsv[*frog] s ->a b <;> nextstate(main 36 wear_bunny_costume.pl:7) v ->c o <@> print sK ->p c <0> pushmark s ->d - <1> ex-stringify sK/1 ->o - <0> ex-pushmark s ->d n <2> concat[t11] sKS/2 ->o l <2> concat[t9] sKS/2 ->m j <2> concat[t8] sKS/2 ->k h <2> concat[t6] sKS/2 ->i f <2> concat[t5] sK/2 ->g d <$> const[PV "$bunny is "] s ->e e <0> padsv[$bunny:35,36] s ->f g <$> const[PV "\n$frog is "] s ->h - <1> ex-rv2sv sK/1 ->j i <#> gvsv[*frog] s ->j k <$> const[PV "\n$toad is "] s ->l - <1> ex-rv2sv sK/1 ->n m <#> gvsv[*toad] s ->n wear_bunny_costume.pl syntax OK