代码之家  ›  专栏  ›  技术社区  ›  Stephen

我们可以在Perl中获得严格引用冲突的堆栈跟踪吗?

  •  1
  • Stephen  · 技术社区  · 8 年前

    我正在使用 use strict 在我的Perl程序中,这些错误并没有像它们那样有用,因为它们只列出了一行有问题的代码。当use strict失败时,有没有办法获得回溯?

    1 回复  |  直到 8 年前
        1
  •  6
  •   amon    8 年前

    这个 strict pragma包含类别 subs 禁止空话 vars 这要求您声明所有变量。那些是 错误。这些代码的堆栈跟踪没有帮助,因为它们直接来自该行的源代码。

    严格的 类别 refs 禁止字符串作为引用,这是一个 . 在这里,stacktrace可能有助于找出该字符串的来源。

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

    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