我想根据用户的偏好设置致命错误,将其降级为警告(或者相反,可以将警告升级为致命错误)。目前,我正在die
像这样使用和覆盖它:
my $force;
BEGIN {
no warnings 'once';
Getopt::Long::Configure('pass_through');
GetOptions('force', \$force);
*CORE::GLOBAL::die = sub { warn @_ } if $force;
Getopt::Long::Configure('no_pass_through');
}
use My::Module;
...
die "maybe";
...
exit(1) if $force;
exit(0); # success!
我不喜欢这种方法,主要是因为我仍然想死一些地方(例如缺少命令行参数)。我宁愿更改die
to的(大多数)实例warn
并执行条件use warnings FATAL => 'all'
1。问题是,它use warnings
在词法上是作用域的,所以这是无效的:
if (!$force) {
use warnings FATAL => 'all';
}
尝试使用有条件的后缀是语法错误:
use warnings FATAL => 'all' unless $force;
并且use
不能在表达式中使用:
$force or use warnings FATAL => 'all'; # syntax error
我可以想到各种令人讨厌的变通方法(定义我自己的警告/死者,在if / else中复制我的主脚本代码等),但是我正在寻找一种优雅的解决方案,有条件地适用use warnings
于当前的词法范围。(将它应用于父级范围也可以,但是可能需要使用黑魔法。)
use warnings::register
到模块和use warnings FATAL => 'My::Module'
脚本中,但是对于这个问题而言,区别并不重要。
您可以尝试:
use if !$force, warnings => qw( FATAL all );
是的,有一个if
与Perl一起分发的名为的模块,可以很容易地进行条件导入。
请注意,这是在编译时评估的,因此$force
需要在编译时定义。(可能在一个BEGIN { ... }
块内。)基于问题中的代码示例,您似乎已经弄清楚了该部分。
或者,更多手册:
BEGIN {
require warnings;
warnings->import(qw/ FATAL all /) unless $force;
}
完全不同的方法是使用信号处理程序$SIG{__WARN__}
或$SIG{__DIE__}
在运行时决定是否死亡。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句