Как я могу получить номер файла и строки, где была создана ссылка подпрограммы 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" работают нормально, если я не использую директивы line. Похоже, это может быть ошибка в модуле B:: GV.

Ответ 1

Вы можете попробовать caller. Это то, что отладчик использует для создания трассировки стека, поэтому, возможно, это то, что вы хотите.

Я не думаю, что __LINE__, __FILE__ и __PACKAGE__ помогут вам здесь, поскольку они предоставляют только место выполнения current, что означает, что с учетом ссылки на код или под как в вашем коде, вы получите те же результаты.