Perlで特定のオブジェクトまたはパッケージで使用可能なメソッドを一覧表示するにはどうすればよいですか?
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';
Perlで物事を行う方法はたくさんあるので、Perlでこれを行う方法は(むしろ)たくさんあります。誰かがコメントしたように、オートロードされたメソッドは常に少し注意が必要です。ただし、独自のアプローチを採用するのではなく、CPANの Class :: Inspector を確認することをお勧めします。これにより、次のようなことができます。
my $methods = Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
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();
ムースを使用;#、その素晴らしい。
一般に、Perlのような動的言語ではこれを行うことはできません。パッケージはあなたが見つけることができるいくつかのメソッドを定義するかもしれませんが、あなたがそれらを使うまで定義を持たないその場でメソッドを作ることもできます。さらに、(機能する)メソッドを呼び出しても、それを定義できない場合があります。それが動的言語を素晴らしいものにするようなものです。 :)
どのような課題を解決しようとしていますか?
構造と継承履歴を取得する方法 からの良い答え
オブジェクトのクラスが現在継承しているクラスは、以下を使用して見つけることができます。
use mro qw( );
use Scalar::Util qw( blessed );
say join ", ", @{ mro::get_linear_isa(blessed($o)) };