Этот вопрос уже имеет ответ здесь:
Как я получаю отслеживания стека в Perl?
Существует множество полезных инструментов, основанных на ядре и CPAN, для создания трассировки стека (как показано в других ответах). Однако, если вы хотите создать свой собственный, проверьте caller
builtin. С ее помощью вы можете пройтись по стеку и посмотреть, что именно происходит.
Для отладки мне нравится Карп :: Всегда .
perl -MCarp::Always my_script.pl
Carp :: confess
(из используйте Carp;
) даст вам полную трассировку стека как часть ошибки. Если вам это просто нужно в связи с чем-то неудачным, признайтесь,
- это все, что вам действительно нужно.
Согласно комментариям, вот вывод различных функций Carp
:
use strict;
use warnings;
use Carp qw/longmess cluck confess/;
sub foo {
&bar;
}
sub bar {
&baz;
}
sub baz {
shift->();
}
my %tests = (
'longmess' => sub { print longmess 'longmess' },
'cluck' => sub { cluck 'using cluck' },
'confess' => sub { confess 'using confess' },
);
while (my ($name, $sub) = each %tests) {
print "$name - before eval:\n";
eval {
foo($sub);
};
print "$name - before if:\n";
if ($@) {
print "caught: $@";
}
print "$name - done\n\n";
}
Запустив этот сценарий, вы получите:
longmess - before eval: longmess at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a4d0)') called at - line 26 eval {...} called at - line 25 longmess - before if: longmess - done confess - before eval: confess - before if: caught: using confess at - line 20 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a3e0)') called at - line 26 eval {...} called at - line 25 confess - done cluck - before eval: using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25 cluck - before if: cluck - done
Выполнив этот сценарий, но перенаправив STDOUT (таким образом, показывая, что печатается на STDERR), вы получите :
using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25