如何获取coderef的行号和文件名?

时间:2018-03-26 11:26:45

标签: perl

说我有一些库代码,与此完全不同:

sub try_hard {
  my $sub = shift;
  my $tries = 3;
  my @failures;
  while($tries--) {
    eval {
      my $success = $sub->(@_) or die "sub returned false value";
      1;
    } or do {
      push @failures, $@;
    }
  }
  die "try_hard: failed 3 times: $failures[-1]"
}

这可能会失败:

try_hard: failed 3 times: sub returned false value at BadUtils.pm line 7 

...如果您在多个地方拨打try_hard并且您不知道哪个呼叫是软故障的呼叫,则无效。

如果我能得到$sub的来源,我可以将其改为:

  my $success = $sub->(@_) or die "sub returned false value at $file line $lineno
";

并且库将略微DWIMmer。是否有可能实现这一目标?

2 个答案:

答案 0 :(得分:3)

使用croak代替die。您可以使用

启动脚本来强制执行回溯
perl -MCarp::Always script

PERL5OPT=-MCarp::Always script

答案 1 :(得分:2)