2009-02-02 90 views
10

给定子程序引用,是否有办法找出声明子程序的文件和行号?警告和朋友似乎得到这个权利,但我需要这个外部。这里是我的测试程序:如何获取创建Perl子例程引用的文件和行号?

#!/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的工作,这对我来说没有多大用处)。

有没有其他的方式来获取这些信息,我在上面的代码中做错了什么?

更新:事实证明,如果我不使用行指令,'FILE'和'LINE'方法似乎工作正常。看起来它可能是B :: GV模块中的一个错误。

+0

也许更详细的解释你期待什么,为什么会有所帮助。不经意间读者很容易忽视示例中的“特殊”评论,而不理解它们对行计数器的影响。 – converter42 2009-02-02 17:35:41

回答

4

你可以试试看caller。这是调试器用来构建堆栈跟踪的内容,所以也许它就是你想要的。

我不认为__LINE____FILE____PACKAGE__你帮助在这里,因为他们只提供当前的执行点的位置,这意味着给定一个代码引用或子在你的代码,你会得到相同的结果。

相关问题