gpt4 book ai didi

perl - 将空子程序与至少有一些最少代码的子程序区分开来

转载 作者:行者123 更新时间:2023-12-01 00:36:43 25 4
gpt4 key购买 nike

是否有可能以不涉及通过 B::Deparse 解析相关子例程的方式进行?或者任何回到它的源形式?手头的任务是当一个属性(通过 package Foo;sub x :ATTR(...); ... sub x { ... } )被应用到它时,知道一个特定的子程序引用是否指向一个预先声明的没有实际主体(如 Attribute::Handlers )。一开始我以为$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'在我公认的有限测试中,仅当仅预先声明了 sub 时才为真。它甚至会过滤掉没有像 sub x{} 这样的语句的 subs ,正如我所愿,与前一种解决方案不同。我对此唯一的提示是不同 Perl 版本之间可能存在差异,但我还找不到这样的信息;无论如何,我大部分时间都坚持我目前的版本。

我通过盲目的猜测找到了它,我被 Chromatic、Damian Conway 和 Curtis Poe ( link) 所著的《Perl Hacks: Tips & Tools for Programming, Debugging, and Surviving》一书指出了正确的方向。它描述了如何在一个模块中找到最大的子程序。所以我希望重写代码来获得给定子程序的大小,但是代码太重而无法在项目中使用,包括另一个 CPAN 模块依赖项。所以我寻找另一种选择,摆弄 CPAN B::TerseSize模块,直到我发现它们几乎都使用 B以一种或另一种方式做他们的事情。但是查看 B 的文档模块是一件苦差事。长话短说,我只是猜到了 START在疯狂打印各种 CV 的返回值之后,我最终要寻找的东西是方法。

关于perl - 将空子程序与至少有一些最少代码的子程序区分开来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com