Как я могу получить файл и номер строки, где была создана ссылка на подпрограмму Perl? - PullRequest
10 голосов
/ 02 февраля 2009

Учитывая ссылку на подпрограмму, есть ли способ узнать файл и номер строки, в которой была объявлена ​​подпрограмма? предупреждаю, и друзья, кажется, понимают это правильно, но мне это нужно внешне. Вот моя тестовая программа:

#!/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, мне это не очень полезно) 1007 *

Есть ли другой способ получить эту информацию, и я что-то не так делаю в приведенном выше коде?

Обновление : Оказывается, методы 'FILE' и 'LINE' работают нормально, если я не использую директивы строки. Похоже, что это может быть ошибка в модуле B :: GV.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2009

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

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

0 голосов
/ 15 февраля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...