如何抑制来自Perl函数的警告?
在PHP中,您可以在函数调用前面使用如何抑制来自Perl函数的警告?,perl,error-handling,Perl,Error Handling,在PHP中,您可以在函数调用前面使用@,以抑制返回的警告 Perl中有类似的东西吗?PHP的这一特性非常疯狂,应该尽可能避免使用 Perl有两种异常:致命错误和警告。警告可以由Perl本身发出,也可以由用户代码发出 在某个静态/词法范围内,可以关闭Perl的内置警告,如下所示: use warnings; foo(); sub foo { no warnings 'uninitialized'; # recommended: only switch of specific catego
@
,以抑制返回的警告
Perl中有类似的东西吗?PHP的这一特性非常疯狂,应该尽可能避免使用 Perl有两种异常:致命错误和警告。警告可以由Perl本身发出,也可以由用户代码发出 在某个静态/词法范围内,可以关闭Perl的内置警告,如下所示:
use warnings;
foo();
sub foo {
no warnings 'uninitialized'; # recommended: only switch of specific categories
warn "hello\n";
1 + undef; # Otherwise: Use of uninitialized value in addition (+)
}
输出:hello
在STDERR上
(可以找到所有警告类别的列表)
但这不能用于从正在调用的代码(动态范围)中删除警告。这也不会使用户定义的警告静音
在这种情况下,您可以为\uuuu WARN\uuu
伪信号编写处理程序:
use warnings;
{
local $SIG{__WARN__} = sub { };
foo();
print "bye\n";
}
sub foo {
warn "hello\n";
1 + undef;
}
输出:bye
在标准输出上
我们可以将其抽象为一个函数muffle
:
sub muffle {
my $func = shift;
local $SIG{__WARN__} = sub { };
return $func->(@_);
}
muffle(\&foo, 1, 2, 3); # foo(1, 2, 3)
然而,这是一件非常愚蠢的事情:
- 警告指出了潜在的问题和bug。解决这些问题,而不是忽略它们
- 首先不要为您不感兴趣的类别激活内置警告。例如,许多人非常高兴
值字符串化为空字符串,并且不希望得到任何警告undef
此处概述的策略不处理致命异常,请改用。更简单的方法是使用
无警告代码>有关更多信息,请参阅链接。将给出警告的语句用大括号括起来,以删除警告消息
例如
{
没有警告;
}
您也可以运行perl-X
并禁用所有警告
我认为有充分的理由这样做FWIW。顺便问一句,为什么不能通过本地化STDERR来消除警告<代码>perl-e'local*STDERR;warn 4'
@mpapec有趣…我敢打赌warn
和内置警告在执行时不会查找*main::STDERR
符号,它们只是直接打印到文件句柄。但是,重新打开文件句柄可以很好地工作……当你把它作为一个适当的问题发布在这里时,也许有人知道答案。我很好奇。tnx amon,我已经发布了单独的问题,也许更强调的是,这是一件非常愚蠢的事情。做事情通常有正确的方式和错误的方式——这是错误的方式之一。更好的问题是:如何正确使用此函数,以避免收到警告?如果您需要调用其他人的错误函数,您实际上没有选择。非常正确,例如,当您正在处理生产代码时,会发出不必要或不太有用的警告,但这些警告尚未清除。或者测试您是否在某个地方编写了大量警告。
{
no warnings;
<statement giving warning>
}