如何在Perl中列出给定对象或包上的可用方法?

时间:2009-05-26 12:31:14

标签: perl introspection

如何在Perl中列出给定对象或包的可用方法?

5 个答案:

答案 0 :(得分:37)

在Perl中有很多方法可以做到这一点,因为在Perl中有很多方法可以做。正如有人评论的那样,自动加载的方法总是有点棘手。但是,我建议您在CPAN上查看Class::Inspector,而不是滚动自己的方法。那会让你做类似的事情:

my $methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

答案 1 :(得分:21)

如果您有一个名为Foo的软件包,那么应该这样做:

no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
  print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';

或者,要获取所有方法的列表:

no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';

答案 2 :(得分:12)

如果你有一个使用Moose的软件包相当简单:

print PackageNameHere->meta->dump;

更完整的数据:

use Data::Dumper;
print Dumper( PackageNameHere->meta ); 

会让你开始。对于其他所有内容,->meta

中记录的use Class::MOP::Class; my $meta = Class::MOP::Class->initialize( PackageNameHere ); 上显示的方法

你可以在没有它的情况下为包裹做一些AdHoc伪造的驼鹿善良:

 $meta->get_method_map(); 

然后像使用Moose一样继续使用Class :: MOP方法。

首先:

{{1}}

使用Moose; #, awesome

答案 3 :(得分:4)

通常,您不能使用像Perl这样的动态语言来执行此操作。该软件包可能会定义一些您可以找到的方法,但它们也可以在您使用它们之前动态地组成没有定义的方法。此外,即使调用方法(有效)也可能无法定义它。这就是使动态语言变得美好的东西。 :)

你想解决什么任务?

答案 4 :(得分:1)

How to get structure and inheritance history的好答案
可以使用以下命令找到对象的类当前从其继承的类:

use mro          qw( );
use Scalar::Util qw( blessed );
say join ", ", @{ mro::get_linear_isa(blessed($o)) };