Вероятно, это связано с тем, что метод унаследован от базового класса.Однако в чрезвычайно странных ситуациях он МОЖЕТ также динамически вводиться в пространство имен модуля, что гораздо сложнее понять.
Вы можете найти свой саб или путем перебора, или путем определения базового класса модуля (и, возможно, выше по цепочке наследования) и поиска только кода базовых классов.Я покажу, как сделать оба:
Поиск методом грубой силы : Это, вероятно, простейшее решение в сложных случаях, поскольку подводная лодка могла быть введена впространство имен модуля динамически с помощью модуля, не являющегося предком, и поиск модулей-предков не является простым на 100% из-за множественных способов определения наследования, которое можно было бы использовать (использовать базу, использовать родителя, вещи Moose, вещи AUTOLOADED)
Firstвыясните, какие другие модули загружены с помощью My :: Module
perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'
Это распечатает местоположение ВСЕХ этих модулей
Затем найдите подопределение во ВСЕМ этом коде (следующие должны быть все в одну строку, я делю его для удобства чтения на 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 или динамически внедряется в таблицу символов, что может происходить в любом коде, не обязательно в родительском.