Perl 脚本都是内部编译为语法树,然后根据语法树解析执行每一步。察看一个脚本的语法树用模块B::Concise,简单说明如下:
B::Concise - 遍历语法树,打印每一个执行码(ops)的内容
用法:perl -MO=Concise[,OPTIONS] script
常用OPTIONS:
-basic: 默认模式,打印内存树状结构OPs
-exec: 根据执行顺序打印OPs,可同默认basic作比较
C:\>perl -MO=Concise -e "$a = 43 / 20; print $a"a <@> leave[1 ref] vKP/REFC ->(end)1 <0> enter ->22 <;> nextstate(main 1 -e:1) v:{ ->35 <2> sassign vKS/2 ->63 <$> const[NV 2.15] s ->4- <1> ex-rv2sv sKRM*/1 ->54 <#> gvsv[*a] s ->56 <;> nextstate(main 1 -e:1) v:{ ->79 <@> print vK ->a7 <0> pushmark s ->8- <1> ex-rv2sv sK/1 ->98 <#> gvsv[*a] s ->9-e Syntax OKC:\>perl -MO=Concise,-exec -e "$a = 43 / 20; print $a"1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{3 <$> const[NV 2.15] s4 <#> gvsv[*a] s5 <2> sassign vKS/26 <;> nextstate(main 1 -e:1) v:{7 <0> pushmark s8 <#> gvsv[*a] s9 <@> print vKa <@> leave[1 ref] vKP/REFC-e Syntax OK-terse: 以上都是打印OPs缩略,并不明显,用此参数显示OPs更加明显。用此参数实际等同于perl -MO=Terse ......
C:\>perl -MO=Concise,-terse -e "$a = 43 / 20; print $a"ListOP (0x2918118) leave [1] OP (0x291801c) enter cop (0x291813c) nextstate BInop (0x2918178) sassign SVOP (0x291819c) const [4] NV (0x285a864) 2.15 Unop (0x2918220) null [15] PADOP (0x2918240) gvsv GV (0x285a814) *a cop (0x291805c) nextstate ListOP (0x29180b4) print OP (0x2918098) pushmark Unop (0x29180d8) null [15] PADOP (0x29180f8) gvsv GV (0x285a814) *a -e Syntax OKC:\>perl -MO=Concise,-terse,-exec -e "$a = 43 / 20; print $a"OP (0x2918274) enter cop (0x2918394) nextstate SVOP (0x29183f4) const [4] NV (0x285a86c) 2.15 PADOP (0x2918498) gvsv GV (0x285a81c) *a BInop (0x29183d0) sassign cop (0x29182b4) nextstate OP (0x29182f0) pushmark PADOP (0x2918350) gvsv GV (0x285a81c) *a ListOP (0x291830c) print ListOP (0x2918370) leave [1] -e Syntax OK-src: 以上都是整体语法树,加此参数可以显示每一行对应编译后的语法树,不过此参数只能对文件起作用,对-e 执行的单行程序不能很好的支持。
对于perl 的一些简写,如果想知道内部是如何处理的,可以反编译语法树,从执行码推导脚本,用B::Deparse模块。
C:\>perl -MO=Deparse -ne "print if /test/" stock.plliNE: while (defined($_ = <ARGV>)) { print $_ if /test/;}-e Syntax OK使用以上的模块,参考OPs的定义,可以帮助更好地了解perl的内部实现。 总结
以上是内存溢出为你收集整理的Perl B module全部内容,希望文章能够帮你解决Perl B module所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)