如何抑制Perl函数的警告?

时间:2013-10-21 09:11:58

标签: perl error-handling

在PHP中,您可以在函数调用前使用@来禁止返回警告。

Perl中有类似内容吗?

3 个答案:

答案 0 :(得分:24)

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 (+)
}

输出:STDERR上的hello

但是这不能用于从调用(动态范围)的代码中删除警告。这也不会使用户定义的警告静音。

在这种情况下,您可以为__WARN__伪信号编写处理程序:

use warnings;
{
  local $SIG{__WARN__} = sub { };
  foo();
  print "bye\n";
}

sub foo {
  warn "hello\n";
  1 + undef;
}

在STDOUT输出:bye

我们可以将其抽象为函数muffle

sub muffle {
  my $func = shift;
  local $SIG{__WARN__} = sub { };
  return $func->(@_);
}

muffle(\&foo, 1, 2, 3); # foo(1, 2, 3)

然而,这是一件非常愚蠢的事情:

  • 警告指出潜在的问题和错误。修复这些而不是忽略它们。
  • 对于您不感兴趣的类别,请勿首先激活内置警告。很多人都非常高兴undef值字符串化为空字符串,并且不希望有任何警告。

此处列出的策略不会处理致命异常,请改用Try::Tiny

答案 1 :(得分:3)

您也可以运行perl -X并停用所有警告。

我认为有充分理由做这个FWIW。

答案 2 :(得分:0)

更简单的方法是使用no warnings;有关详细信息,请参阅perldoc链接。用大括号括起语句,以消除警告信息。

E.g。

{
     no warnings;
     <statement giving warning>
}