我正在翻阅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);
以下是答案:
(我无法发布这个答案本身,因为我没有足够的声誉)
我发现在perl中找到导入函数定义的最快方法是以下命令:
>perl.exe -d <filename>.pl
这将启动调试器。 然后;做
b <name of the function/subroutine who's definition you are looking for>
在我们的案例中意味着进入:
b rvt_deploy_library
然后按“c”跳转到上述功能/子程序。
这使调试器具有所需的功能。现在,您可以看到行号。以及控制台上函数/子程序的位置。
main::rvt_deploy_library(D:/CAT/rvt/lib/rvt.pm:60):
答案 0 :(得分:6)
在Perl中声明方法有很多种方法。这是一个几乎肯定不完整的清单:
sub NAME { ... }
method NAME (...) {...}
*NAME = sub {...};
此外,如果包声明了AUTOLOAD
函数,则可能没有明确的方法定义。有关详细信息,请参阅perlsub。
答案 1 :(得分: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;
打印的内容如下:
CODE(0x80ff50):
file: so.pl
line: 7
name: function_to_find
package: main
答案 2 :(得分:4)
B::Xref将显示代码使用的所有文件中声明的所有函数。