当前位置:  开发笔记 > 编程语言 > 正文

发现Perl模块的所有子程序的最佳方法是什么?

如何解决《发现Perl模块的所有子程序的最佳方法是什么?》经验,为你挑选了3个好方法。

以编程方式发现perl模块具有的所有子例程的最佳方法是什么?这可以是一个模块,一个类(没有@EXPORT),或者介于两者之间的任何东西.

编辑:下面的所有方法看起来都可以.我可能在生产中使用Class :: Sniff或Class :: Inspector.然而,莱昂的回答被标记为"被接受",因为它回答了提出的问题,即使no strict 'refs'必须使用.:-) Class :: Sniff可能是一个很好的选择,因为它的进展; 看起来很多想法已经进入其中.



1> Leon Timmerm..:
sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::$_"} } keys %{"$module\::"}
}

ETA:如果要过滤掉导入的子例程,可以执行此操作

use B qw/svref_2object/;

sub in_package {
    my ($coderef, $package) = @_;
    my $cv = svref_2object($coderef);
    return if not $cv->isa('B::CV') or $cv->GV->isa('B::SPECIAL');
    return $cv->GV->STASH->NAME eq $package;
}

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::$_"} and in_package(\&{*$_}, $module) } keys %{"$module\::"}
}



2> jrockway..:

Class :: Inspector:

Class :: Inspector允许您获取有关已加载类的信息.大多数或所有这些信息都可以通过其他方式找到,但它们并不总是非常友好,并且通常涉及相对较高级别的Perl魔法,或者奇怪且不寻常的代码.Class :: Inspector尝试为这些信息提供更简单,更友好的界面......



3> nxadm..:

看看这个: Class :: Sniff

该界面目前非常特殊,很可能会发生变化.创建新实例后,调用报表方法是最佳选择.然后,您可以直观地检查它以查找潜在的问题:

my $sniff = Class::Sniff->new({class => 'Some::Class'});
print $sniff->report;

该模块试图帮助程序员在面向对象的代码中找到"代码味道".如果它报告某些内容,则并不意味着您的代码是错误的.这只是意味着你可能想要更仔细地查看你的代码,看看你是否有任何问题.

目前,我们假设Perl默认最左侧,深度优先搜索顺序.我们将来可能会对此进行更改(并且会对路径方法进行解决.稍后会详细介绍)...


您可能需要在生产环境中获取方法列表的原因是什么?
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有