如何获取创建Perl子例程引用的文件和行号?

时间:2009-02-02 16:14:41

标签: 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工作,这对我来说没用多少。)< / p>

是否有其他方法可以获取此信息并且我在上面的代码中做错了什么?

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

2 个答案:

答案 0 :(得分:4)

您可以尝试查看caller。这是调试器用于构建堆栈跟踪的内容,因此可能是您想要的。

我认为__LINE____FILE____PACKAGE__不会帮助您,因为它们只提供当前执行点的位置,这意味着如果您的代码中有代码引用或子代码,您将获得相同的结果。

答案 1 :(得分:0)

您已经在执行其中一些操作,但也请参阅Perlmonks主题"Track the filename/line number of an anonymous coderef"

相关问题