Perl 区分空子例程和至少有一些最小代码的子例程

Perl 区分空子例程和至少有一些最小代码的子例程,perl,Perl,是否有可能不涉及通过B::Deparse或其他方式将所讨论的子例程解压回其源代码形式?手头的任务是了解当一个属性(通过属性::处理程序)应用于某个特定的子例程时,该子例程引用是否指向不带实际主体的预先声明的子例程(如包Foo;sub x:ATTR(…);…sub x{…})。起初我认为在这种情况下,$code参数是未定义的,但事实证明并非如此。而deparsing可以用于此任务,因为这样的子例程只返回一个';'作为他们通过B::Deparse反编译的代码,将其用于大型函数有其考虑因素,以及在所有

是否有可能不涉及通过
B::Deparse
或其他方式将所讨论的子例程解压回其源代码形式?手头的任务是了解当一个属性(通过
属性::处理程序
)应用于某个特定的子例程时,该子例程引用是否指向不带实际主体的预先声明的子例程(如
包Foo;sub x:ATTR(…);…sub x{…}
)。起初我认为在这种情况下,
$code
参数是未定义的,但事实证明并非如此。而deparsing可以用于此任务,因为这样的子例程只返回一个
';'
作为他们通过
B::Deparse
反编译的代码,将其用于大型函数有其考虑因素,以及在所有版本的Perl、使用过的模块等中对该输出的依赖性。不太好。

我想我已经找到了一个不进行反编译或大小测试的解决方案。使用B模块,我可以查询

my $cv=B::svref_2object($code);
undef $code if ref $cv->START eq 'B::NULL';
其中,
if-ref$cv->START-eq'B::NULL'
在我的测试中是公认的有限测试,仅当一个子节点仅被预先声明时才为真。与前一种解决方案不同的是,它甚至过滤掉了没有像
subx{}
这样语句的sub,这正是我想要的。我唯一的不满是不同Perl版本之间可能存在差异,但我还没有找到这样的信息;不管怎样,我大部分时间都坚持我目前的版本


我是通过瞎猜找到它的,Coloric、Damian Conway和Curtis Poe()的一本书《Perl Hacks:Tips&Tools for Programming,Debugger and Survival》为我指明了正确的方向。它描述了如何在模块中找到最大的子例程。因此,我希望重写代码以获得给定子例程的大小,但代码太重,无法在项目中使用,包括另一个CPAN模块依赖项。所以我寻找了另一种选择,摆弄CPAN
B::TerseSize
模块,直到我发现它们几乎都以某种方式使用
B
来完成它们的任务。但是查看
B
模块的文档是件烦人的事。长话短说,在大量打印了各种
CV
方法的返回值之后,我猜测
START
是我最终要寻找的东西。

想要这样做的用例是什么?我的内部对象库基于通过应用于子例程的属性提供的数据生成属性的访问器。子例程的名称是属性的名称,而它将被转换为处理获取和设置属性的子例程。当然,该库允许提供定制的getter和setter。通常情况下,在命名参数中指定其中一个,并从sub的主体中获取另一个的代码。但是为了实现这一点,我必须区分没有主体的sub和常规sub,因此在第一种情况下,我可以生成一个隐式访问器。