用B::Deparse揭露Perl的魔法

B::Deparse 模块将Perl程序编译,然后反解析,生成内部生成的源代码。这有什么用呢?嗯,它让你可以看到幕后的情况,检查Perl是如何结构化程序代码的,这可以帮助你调试,以及其他事情。
示例
考虑本周关于子程序签名的文章中的粘性参数优化。我们知道从速度基准测试中,使用粘性参数后,签名速度提高了大约30%,我们可以推理出为什么是这样,但B::Deparse可以显示原因。以下是两个签名的代码,一个是正常的,另一个使用了粘性参数
use feature 'signatures';
sub normal_signature ($foo) {}
sub slurpy_signature ($foo, @) {}
现在,如果我们把代码保存为signatures.pl,我们就可以在命令行使用B::Deparse来检查它
$ perl -MO=Deparse signatures.pl
这生成了以下输出
sub normal_signature {
use feature 'signatures';
die 'Too many arguments for subroutine' unless @_ <= 1;
die 'Too few arguments for subroutine' unless @_ >= 1;
my $foo = $_[0];
();
}
sub slurpy_signature {
use feature 'signatures';
die 'Too few arguments for subroutine' unless @_ >= 1;
my $foo = $_[0];
();
}
signatures.pl syntax OK
生成的代码显示了Perl如何内部结构化signatures.pl代码。你可以看到“slurpy_signature”有一个更少的die语句。这解释了性能提升的原因,因为子程序要做的更少。魔法被揭露了!
B::Deparse更多内容
B::Deparse附带详尽的文档,并有一些有用的选项来更改输出。
brian d foy的《精通Perl》书中有很多宝石,其中“Cleaning up Perl”章节中的B::Deparse条目就是其中之一。在书中,brian展示了B::Deparse的几个用途,包括调试单行代码和解码混淆代码。你可以在网上阅读章节的草稿这里。
PerlMonks有一个有趣的条目,对于那些好奇为什么命令行使用B::Deparse的命令是“-MO=Deparse”而不是“-MB::Deparse”的人来说。
感谢
再次感谢Perl Pumpking和teflon man Ricardo Signes,他让我开始使用B::Deparse来分析子程序签名。
本文最初发布在 PerlTricks.com。
标签
反馈
这篇文章有什么问题?请通过在 GitHub 上打开问题或拉取请求来帮助我们。