2017-10-05 40 views

回答

6

strict编译包含禁止裸字的类别subsvars这需要你声明的所有变量。那些是编译时间错误。这些堆栈跟踪没有帮助,因为它们直接源自该行的源代码。

strict类别refs禁止字符串作为参考,这是运行时错误。这里一个堆栈跟踪可能有助于找出字符串来自哪里。

获取堆栈跟踪的一种方法是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

+3

'鲤鱼:: cluck'和'鲤鱼:: confess'总是输出堆栈轨迹。 – mob

相关问题