Perlモジュールが持っているすべてのサブルーチンを発見する最良の方法は何ですか?
-
03-07-2019 - |
質問
perlモジュールが持っているすべてのサブルーチンをプログラムで発見する最良の方法は何ですか?これは、モジュール、クラス(@EXPORTなし)、またはその間のものです。
編集:以下のメソッドはすべて、動作するように見えます。実稼働環境では、おそらくClass :: SniffまたはClass :: Inspectorを使用します。ただし、Leonの回答は、厳密な 'refs'
を使用する必要はありませんが、提起された質問に回答するため、 'accepted'とマークされます。 :-) Class :: Sniffは、進行するのに適した選択肢です。多くのことを考え込んでいるようです。
解決
sub list_module {
my $module = shift;
no strict 'refs';
return grep { defined &{"$module\::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\::sub list_module {
my $module = shift;
no strict 'refs';
return grep { defined &{"$module\::<*>
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>"} } keys %{"$module\::"}
}
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>"} and in_package(\&{*sub list_module {
my $module = shift;
no strict 'refs';
return grep { defined &{"$module\::<*>
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>"} } keys %{"$module\::"}
}
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>}, $module) } keys %{"$module\::"}
}
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>"} } keys %{"$module\::"}
}
ETA:インポートされたサブルーチンを除外する場合、これを行うことができます
<*>他のヒント
Class :: Inspectorを使用すると、ロードされたクラスに関する情報を取得できます。この情報の大部分またはすべては他の方法で見つけることができますが、常に非常に友好的であるとは限らず、通常、比較的高レベルのPerlウィザード、または奇妙で珍しいコードが含まれます。 Class :: Inspectorは、この情報により簡単で使いやすいインターフェースを提供しようとしています...
これを見てください: Class :: Sniff
現在、インターフェースはかなりアドホックであり、変更される可能性があります。新しいインスタンスを作成した後、レポートメソッドを呼び出すことが最良のオプションです。次に、潜在的な問題を探すために視覚的に調べることができます:
my $sniff = Class::Sniff->new({class => 'Some::Class'}); print $sniff->report;
このモジュールは、プログラマがオブジェクト指向コードで「コードのにおい」を見つけるのを支援しようとします。何かを報告しても、コードが間違っているという意味ではありません。それは、問題があるかどうかを確認するために、コードをもう少し詳しく見てみたいということを意味します。
現時点では、Perlのデフォルトの左端、深さ優先の検索順序を想定しています。将来的にこれを変更する可能性があります(そして、pathsメソッドの回避策があります。これについては後で詳しく説明します)...