Как я могу получить номер файла и строки, где была создана ссылка подпрограммы 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, что означает, что с учетом ссылки на код или под как в вашем коде, вы получите те же результаты.
Ответ 2
Вы уже делаете часть этого, но также видите Perlmonks thread "Отслеживать имя файла/номер строки анонимного coderef" .