gpt4 book ai didi

perl - 如何有条件地使警告致命?

转载 作者:行者123 更新时间:2023-12-01 12:44:34 24 4
gpt4 key购买 nike

我希望根据用户的偏好将 fatal error 降级为警告(或者相反,可以升级为 fatal error 的警告)。目前,我正在使用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 的实例至 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

我可以想到各种令人反感的解决方法(定义我自己的 warn/die,在 if/else 中复制我的主脚本代码,等等)但我正在寻找一个有条件地应用的优雅解决方案 use warnings在当前词法范围内。 (在父作用域中应用它也可以,但可能需要黑魔法。)


1:其实我想加use warnings::register到我的模块和use warnings FATAL => 'My::Module'到我的脚本,但对于这个问题的目的来说,区别并不重要。

最佳答案

你可以试试:

use if !$force, warnings => qw( FATAL all );

是的,有一个名为 if 的模块,它随 Perl 一起分发,使条件导入变得非常容易。

请注意,这是在编译时 求值的,因此需要在编译时定义$force。 (可能在 BEGIN { ... } block 中。)根据您问题中的代码示例,您似乎已经弄清楚了那部分。

或者,更多的手动操作:

BEGIN {
require warnings;
warnings->import(qw/ FATAL all /) unless $force;
}

一种完全不同的方法是使用信号处理程序 $SIG{__WARN__}$SIG{__DIE__} 来决定在运行时是否死亡。

关于perl - 如何有条件地使警告致命?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com