Skip to main content
 首页 » 编程设计

perl之发现 Perl 模块所有子例程的最佳方法是什么

2024年11月24日19jirigala

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

编辑:下面的所有方法看起来都可以工作。我可能会在生产中使用 Class::Sniff 或 Class::Inspector。然而,Leon 的回答被标记为“接受”,因为它回答了所提出的问题,即使 no strict 'refs'必须使用。 :-) Class::Sniff 可能是一个不错的选择。看起来已经有很多想法了。

请您参考如下方法:

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\::"} 
}