如何抑制来自Perl函数的警告?

如何抑制来自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

在PHP中,您可以在函数调用前面使用
@
,以抑制返回的警告


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>
}