给定一个子程序引用,有没有办法找出声明子程序的文件和行号?警告和朋友似乎做对了,但我需要外部。这是我的测试程序:
#!/usr/bin/perl -l
use strict;
use warnings;
use B;
# line 99 'bin/some_code.pl'
{
no strict 'refs';
print B::svref_2object(\*{'Foo::some_sub'})->LINE;
print B::svref_2object(\&Foo::some_sub)->GV->LINE;
}
Foo::some_sub();
package Foo;
# line 23 'bin/some_file.pl'
sub some_sub {
warn "Got to here";
}
输出:
102
102
Got to here at 'bin/some_file.pl' line 24.
线路信息不是我所期待的,所以我假设我做错了(B :: GV有一个相应的FILE方法,但是直到我让LINE工作,这对我来说没用多少。)< / p>
是否有其他方法可以获取此信息并且我在上面的代码中做错了什么?
更新:事实证明,如果我没有使用行指令,'FILE'和'LINE'方法似乎工作正常。看起来它可能是B :: GV模块中的一个错误。
答案 0 :(得分:4)
您可以尝试查看caller
。这是调试器用于构建堆栈跟踪的内容,因此可能是您想要的。
我认为__LINE__
,__FILE__
和__PACKAGE__
不会帮助您,因为它们只提供当前执行点的位置,这意味着如果您的代码中有代码引用或子代码,您将获得相同的结果。
答案 1 :(得分:0)
您已经在执行其中一些操作,但也请参阅Perlmonks主题"Track the filename/line number of an anonymous coderef"。