これはおそらく、メソッドが基本クラスから継承されているためです。ただし、非常に奇妙な状況では、モジュールの名前空間に動的に注入することもできますが、これを理解するのははるかに困難です。
力ずくで検索するか、モジュールの基本クラス (およびおそらく継承チェーンの上位) を見つけ出し、基本クラスのコードだけを検索することによって、サブルーチンを見つけることができます。両方を行う方法を示します。
ブルート フォース検索: これはおそらく、複雑なケースでは最も簡単な解決策です。サブルーチンが非祖先モジュールによってモジュールの名前空間に動的に注入された可能性があり、祖先モジュールを見つけることは、継承を定義する複数の方法が原因で 100% 簡単ではないためです。使用 (ベースを使用、親を使用、Moose のもの、AUTOLOADED のもの)
まず、My::Module でロードされている他のモジュールを見つけます。
perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'
これにより、これらすべてのモジュールの場所が出力されます
次に、そのすべてのコードでサブ定義を検索します (以下はすべて 1 行である必要があります。読みやすくするために 2 行に分割しています)。
grep search_like
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
返される結果が多すぎる場合は、grep を次のように変更します。
grep "sub search_like"
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
これにより、モジュールコードの継承を実際に分析することなく、My::Module::DB::raw_info が継承するモジュールの定義を見つけることができます。
継承:
ISA
次のように使用して、モジュールの親を見つけます。
perl -e 'use My::Module::DB::raw_info; print "@My::Module::DB::raw_info::ISA\n";'
@ISA
明確にするために、これはMooseのものではなく、を使用する「古典的に継承された」モジュールに対してのみ機能します。また、ルーチンが AutoLoader を使用して呼び出された場合、またはシンボル テーブルに動的に挿入された場合にも機能しません。これは、必ずしも親コードではなく、任意のコードで発生する可能性があります。