1
我在我的Perl程序中使用了use strict
,但这些错误并没有像他们所能提供的那样有用,因为他们只列出了单一的违规行。当严格使用失败时,有没有办法获得回溯?我们可以在Perl中获得严格的refs违规堆栈跟踪吗?
我在我的Perl程序中使用了use strict
,但这些错误并没有像他们所能提供的那样有用,因为他们只列出了单一的违规行。当严格使用失败时,有没有办法获得回溯?我们可以在Perl中获得严格的refs违规堆栈跟踪吗?
的strict
编译包含禁止裸字的类别subs
和vars
这需要你声明的所有变量。那些是编译时间错误。这些堆栈跟踪没有帮助,因为它们直接源自该行的源代码。
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
。
'鲤鱼:: cluck'和'鲤鱼:: confess'总是输出堆栈轨迹。 – mob