24

perlモジュールが持っているすべてのサブルーチンをプログラムで発見する最良の方法は何ですか? これは、モジュール、クラス (@EXPORT なし)、またはその中間である可能性があります。

編集: 以下の方法はすべて動作するように見えます。私はおそらく Class::Sniff または Class::Inspector を本番環境で使用します。ただし、レオンの回答は、使用する必要があるにもかかわらず、提示された質問に回答するため、「承認済み」とマークされていますno strict 'refs'。:-) Class::Sniff は、進行するにつれて良い選択になるかもしれません。いろいろ考えたようです。

4

3 に答える 3

23
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\::"}
}
于 2009-03-03T17:29:56.430 に答える
12

クラス::インスペクター:

Class::Inspector を使用すると、ロードされたクラスに関する情報を取得できます。この情報の大部分またはすべては他の方法で見つけることができますが、必ずしも友好的であるとは限りません。通常、比較的高度な Perl の魔法や奇妙で変わった外観のコードが含まれます。Class::Inspector は、この情報へのより簡単で使いやすいインターフェイスを提供しようとします...

于 2009-03-03T19:27:51.483 に答える
9

これを見てください: Class::Sniff

現時点では、インターフェイスはアドホックであり、変更される可能性があります。新しいインスタンスを作成したら、レポート メソッドを呼び出すのが最適なオプションです。次に、それを視覚的に調べて、潜在的な問題を探すことができます。

my $sniff = Class::Sniff->new({class => 'Some::Class'});
print $sniff->report;

このモジュールは、プログラマーがオブジェクト指向コードの「コードのにおい」を見つけられるようにします。何かが報告されても、コードが間違っているという意味ではありません。これは、コードをもう少し詳しく調べて、問題がないかどうかを確認する必要があることを意味します。

現時点では、Perl のデフォルトの左端、深さ優先の検索順序を想定しています。将来これを変更する可能性があります (そして、パス メソッドを使用した回避策があります。これについては後で詳しく説明します)...

于 2009-03-03T18:08:17.213 に答える