这可能是由于从基类继承的方法。然而,在极其奇怪的情况下,它也可以动态地注入到模块的命名空间中,这很难弄清楚。
您可以通过蛮力搜索或通过找出模块的基类(可能是继承链的更高层)并仅搜索基类代码来找到您的子。我将展示如何做到这两点:
蛮力搜索:这可能是复杂情况下最简单的解决方案,因为子可能已经被非祖先模块动态注入到模块的命名空间中,并且由于定义继承的多种方法可能已经找到祖先模块并不是 100% 容易使用过(使用基础,使用父级,驼鹿的东西,自动加载的东西)
首先,找出哪些其他模块加载了 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 调用例程或动态注入符号表(这可能发生在任何代码中,不一定在父代码中),它也不起作用。