我们可以在Perl中获得严格的refs违规的堆栈跟踪吗?

时间:2017-10-05 14:51:30

标签: perl

我在我的Perl程序中使用use strict,但错误并没有那么有用,因为它们只列出了单个违规行。当使用严格失败时,有没有办法获得回溯?

1 个答案:

答案 0 :(得分:6)

strict编译指示包含禁止裸字的类别subs,以及要求您声明所有变量的vars。那些是编译时错误。这些的堆栈跟踪没有用,因为它们直接来自该行的源代码。

strict类别refs禁止字符串作为引用,这是运行时错误。这里的堆栈跟踪可能有助于找出该字符串的来源。

获取堆栈跟踪的一种方法是use Carp::Always(或作为命令行标志:-MCarp::Always)。这会修改所有错误和警告以包含堆栈跟踪。因为它会使所有错误更长,所以最好只将它用作调试帮助。

如果您遇到的问题是您的子程序获得了无效参数,那么验证输入可能会更好。 E.g:

use Carp;

sub foo {
  my ($ref) = @_;

  # dies from the line where "foo()" was called
  croak q(Argument "ref" must be a scalar reference)
    unless ref $ref eq 'SCALAR' or ref $ref eq 'REF';

  do_something_with($$ref);
}

使用Carp中的一个功能(例如croak()confess())时,您可以通过添加Perl选项-MCarp=verbose来强制执行堆栈跟踪。