web-dev-qa-db-ja.com

Perlで特定のオブジェクトまたはパッケージで使用可能なメソッドを一覧表示するにはどうすればよいですか?

Perlで特定のオブジェクトまたはパッケージで使用可能なメソッドを一覧表示するにはどうすればよいですか?

43
Benoît

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';

または、パッケージFoo内のすべてのメソッドのリストを取得するには:

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

Perlで物事を行う方法はたくさんあるので、Perlでこれを行う方法は(むしろ)たくさんあります。誰かがコメントしたように、オートロードされたメソッドは常に少し注意が必要です。ただし、独自のアプローチを採用するのではなく、CPANの Class :: Inspector を確認することをお勧めします。これにより、次のようなことができます。

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

Moose を使用しているパッケージがある場合、その合理的な単純さ:

print PackageNameHere->meta->dump;

そして、より完全なデータについては:

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

始めましょう。他のすべてについては、->metaに表示されるメソッドがあり、これらは Class :: MOP :: Class に記載されています。

次の方法で、パッケージのムースの良さをアドホックで偽造することができます。

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );

次に、Mooseの場合と同じようにClass :: MOPメソッドの使用に進みます。

手始めに:

 $meta->get_method_map(); 

ムースを使用;#、その素晴らしい

13
Kent Fredric

一般に、Perlのような動的言語ではこれを行うことはできません。パッケージはあなたが見つけることができるいくつかのメソッドを定義するかもしれませんが、あなたがそれらを使うまで定義を持たないその場でメソッドを作ることもできます。さらに、(機能する)メソッドを呼び出しても、それを定義できない場合があります。それが動的言語を素晴らしいものにするようなものです。 :)

どのような課題を解決しようとしていますか?

3
brian d foy

構造と継承履歴を取得する方法 からの良い答え
オブジェクトのクラスが現在継承しているクラスは、以下を使用して見つけることができます。

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