无法在perl代码库中找到函数定义

Cha*_*ani 4 perl

我正在翻阅7900多行perl代码.我需要改变一些事情,事情进展顺利,即使我只有36个小时进入perl.我学习了语言的基本结构,并且能够完成小事.但突然之间我发现了一个函数调用,它在任何地方都没有任何定义.我多次grep'ed检查所有'sub'.我找不到函数定义.我错过了什么?这个函数的定义在哪里.我很确定这是一个用户定义的函数,而不是库函数(从我的名字我猜这个).请帮我找到这个函数的定义.

这是函数用法的几行.

(cfg_machine_isActive($ep)) {
         staf_var_set($ep, VAR_PHASE, PHASE_PREP);
         staf_var_set($ep, VAR_PREP,  STATE_RUNNING);
      } else {
         cfg_machine_set_state($ep, STATE_FAILED);
      }
   }
   $rc = rvt_deploy_library();       #this is the function that is the problem 
   dump_states() unless ($rc != 0);
Run Code Online (Sandbox Code Playgroud)

这是答案:

(我不能发布这个答案本身因为我没有足够的声誉)

我发现在perl中找到导入函数定义的最快方法是以下命令:

>perl.exe -d <filename>.pl
Run Code Online (Sandbox Code Playgroud)

这启动了调试器.然后; 做

b <name of the function/subroutine who's definition you are looking for>
Run Code Online (Sandbox Code Playgroud)

在我们的情况下,这将意味着进入:

b rvt_deploy_library
Run Code Online (Sandbox Code Playgroud)

接下来按"c"跳转到上述功能/子程序.

这使调试器具有所需的功能.现在,您可以看到行号.以及控制台上的函数/子例程的位置.

main::rvt_deploy_library(D:/CAT/rvt/lib/rvt.pm:60): 
Run Code Online (Sandbox Code Playgroud)

a'r*_*a'r 6

在Perl中声明方法有很多种方法.这是一个几乎肯定不完整的清单:

  1. 标准方式,例如. sub NAME { ... }
  2. 使用MooseX :: Method :: Signatures, method NAME (...) {...}
  3. 分配给typeglob,例如. *NAME = sub {...};

另外,如果包声明了一个AUTOLOAD函数,那么该方法可能没有明确的定义.有关更多信息,请参阅perlsub.


too*_*lic 6

B::Xref将显示代码使用的所有文件中声明的所有函数。


Eri*_*rom 5

您可以使用B模块检查任何perl值.在这种情况下:

sub function_to_find {}

sub find_sub (\&) {
    my $code = shift;
    require B;
    my $obj = B::svref_2object($code);  # create a B::CV object from $code

    print "$code:\n";

    print "  $$_[0]: $$_[1]\n" for
        [file    => $obj->FILE],
        [line    => $obj->GV->LINE],
        [name    => $obj->GV->NAME],
        [package => $obj->STASH->NAME];
}

find_sub &function_to_find;
Run Code Online (Sandbox Code Playgroud)

它打印的东西像:

CODE(0x80ff50):
  file: so.pl
  line: 7
  name: function_to_find
  package: main
Run Code Online (Sandbox Code Playgroud)