Jan*_*kie 7 oop perl perl-module package
在查看我接手的一些代码时,我遇到了这一行:
my @files = My::Module::DB::raw_info->search_like(customer_handle => $config->{client}, feed => $config->{site}, arrival =>"$date")
Run Code Online (Sandbox Code Playgroud)
我知道这会从一个名为的包中返回一个数组My::Module::DB::raw_info
.
我不确定(我只是学习OOP),是->search_like
指的是什么.
我没有将其视为变量或子程序 My::Module::DB::raw_info
任何提示将不胜感激.我才开始学习这些东西.这就像在火中沐浴.(我知道我以后会更开心)Yikes!
这可能是由于该方法是从基类继承而来的.然而,在非常奇怪的情况下,它也可以动态地注入到模块的命名空间中,这很难弄清楚.
您可以通过强力搜索或通过计算模块的基类(以及可能更高的继承链)并仅搜索基类代码来查找子.我将展示如何做到这两点:
暴力搜索:这可能是复杂情况下最简单的解决方案,因为sub可以由非祖先模块动态地注入到模块的命名空间中,并且由于多种定义继承的方法,找到祖先模块并非100%容易使用(使用base,使用parent,moose stuff,AUTOLOADED stuff)
首先,找出My :: Module加载的其他模块
perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'
Run Code Online (Sandbox Code Playgroud)
这将打印所有这些模块的位置
然后,在所有代码中搜索子定义(以下应该是所有一行,我将其拆分为可读性为2行):
grep search_like
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
Run Code Online (Sandbox Code Playgroud)
如果返回的结果太多,请将grep更改为
grep "sub search_like"
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
Run Code Online (Sandbox Code Playgroud)
这将在My :: Module :: DB :: raw_info继承的模块中找到您的定义,而无需实际分析继承的模块代码.
继承:
使用ISA
如下方式找出模块的父级:
perl -e 'use My::Module::DB::raw_info; print "@My::Module::DB::raw_info::ISA\n";'
Run Code Online (Sandbox Code Playgroud)
为了澄清,这仅适用于"经典继承"模块@ISA
,而不是Moose的东西.如果使用AutoLoader调用例程或者动态注入到符号表中,它也不起作用,这可能发生在任何代码中,不一定在父代码中.
你的难题的可能原因是My :: Module :: DB扩展了其他一些类.沿着这条线寻找一个街区
use parent Some::Module;
Run Code Online (Sandbox Code Playgroud)
要么
BEGIN { extends Some::Module }
Run Code Online (Sandbox Code Playgroud)
靠近My/Module/DB.pm的顶部
编辑:正如一些评论者在下面有帮助指出的那样,有许多方法可以将Perl类子类化,但这些方法可能是最常见的.(也许.)