在OOP Perl中调用子例程

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!

DVK*_*DVK 8

这可能是由于该方法是从基类继承而来的.然而,在非常奇怪的情况下,它也可以动态地注入到模块的命名空间中,这很难弄清楚.

您可以通过强力搜索或通过计算模块的基类(以及可能更高的继承链)并仅搜索基类代码来查找子.我将展示如何做到这两点:


暴力搜索:这可能复杂情况下最简单的解决方案,因为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调用例程或者动态注入到符号表中,它也不起作用,这可能发生在任何代码中,不一定在父代码中.


Wil*_*and 5

你的难题的可能原因是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类子类化,但这些方法可能是最常见的.(也许.)

  • 也"使用基地..." (3认同)
  • 好吧,如果你原谅双关语,穆斯可能会被使用.;)更新答案以使用父级. (2认同)
  • 除了使用parent或extends之外,还有其他扩展类的方法.例如使用base或直接@ISA更改. (2认同)
  • 首先:哇!我无法克服每个人对这个问题的绝对帮助.事实证明,代码正在扩展其他东西,特别是(当我提到它时,这将是显而易见的)Class :: DBI.非常公开,感谢所有人,特别是Williham Totland和DVK.你推动了一个新方向,我从你的帖子中学到了一些东西...... JW (2认同)