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

Ben*_*oît 40 perl introspection

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

Nic*_*son 38

在Perl中有很多方法可以做到这一点,因为在Perl中有很多方法可以做.有人评论说,自动加载的方法总是有点棘手.但是,我建议你看一下CPAN 上的Class :: Inspector,而不是滚动你自己的方法.这会让你做一些事情:

my $methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
Run Code Online (Sandbox Code Playgroud)

  • 我终于在我的单文件脚本中包含了内联Class :: Inspector,这实际上是更简单的解决方案.谢谢. (2认同)
  • 请注意,Class :: Inspector有局限性.它可以看到已定义的方法,但不会处理UNIVERSAL中的任何内容. (2认同)
  • [perldoc Class :: Inspector](http://search.cpan.org/dist/Class-Inspector/lib/Class/Inspector.pm)说:"返回对所有可用方法名称数组的引用. .." - 确实:`@ methods`应该是`$ methods`. (2认同)

Chr*_*utz 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';
Run Code Online (Sandbox Code Playgroud)

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

no strict 'refs';
my @methods = grep { defined &{"Foo::$_"} } keys %Foo::;
use strict 'refs';
Run Code Online (Sandbox Code Playgroud)

  • 应该递归@ISA数组 (4认同)
  • 当然,您将很难找到自动加载的方法. (3认同)
  • 为什么使用自动加载方法会很困难?我打赌大多数人甚至不知道他们何时使用它们.他们调用一个记录的方法,并发生正确的事情. (2认同)
  • `defined&{$ _}`应该应该是`defined&{“ Foo :: $ _”}`,否则支票无法在**不同的包中使用。 (2认同)

Ken*_*ric 12

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

print PackageNameHere->meta->dump;
Run Code Online (Sandbox Code Playgroud)

并获得更完整的数据:

use Data::Dumper;
print Dumper( PackageNameHere->meta ); 
Run Code Online (Sandbox Code Playgroud)

会让你开始.对于其他所有内容,出现在->meta其上的方法记录在Class :: MOP :: Class中

你可以做一些AdHoc假装的驼鹿善良包装没有它:

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );
Run Code Online (Sandbox Code Playgroud)

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

对于初学者:

 $meta->get_method_map(); 
Run Code Online (Sandbox Code Playgroud)

用驼鹿; #,它真棒.