我一定是理解错了警告文档。根据我的理解,这段代码如下:
use warnings;
use warnings FATAL => 'all';
warnings::warn('numeric', 'blarg');
print "finished\n";应该打印“blarg”警告并终止,因为我已经要求所有警告都是致命的。然而,当我运行我得到的代码时:
$> /opt/local/bin/perl x.pl
blarg at x.pl line 3
finished有人能帮我理解为什么我不能被警告去死吗?
发布于 2009-10-20 04:48:07
好吧。这太难看了。我有一个半准备好的帖子解释说这是warnings中的一个错误,然后我意识到这不是,它只是warnings工作方式中一个非常邪恶的微妙之处。
Warnings开始在warnings::warn的调用者的调用者中寻找相关的堆栈框架来获取警告位。其想法是,您正在编写某个模块,并且在函数中使用warnings::warn或warnings::warnif,并且警告是否被打印(或致命)取决于使用您的模块的代码的作用域中的use warnings设置。没有提供让它从caller(1)而不是caller(2)开始的选项,所以您想要的效果是不可能的。
一个有效的代码示例(并演示了编写该接口的人应该如何使用该接口):
package Foo;
require warnings;
sub bail {
warnings::warnif('numeric', "You fool! You divided by zero!");
}
package main;
use warnings FATAL => all;
Foo::bail();
print "Will never be reached\n";您不能仅仅通过添加另一个级别的子例程来破坏它的工作方式,因为它从第一个调用者那里获取标志,该调用者位于与warn/warnif/enable/etc.的调用者不同的包中
https://stackoverflow.com/questions/1592397
复制相似问题