9

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

Perl 中有类似的东西吗?

4

3 回答 3

29

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 上。

(可以在此处找到所有警告类别的列表)

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

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

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

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

输出:bye在 STDOUT 上。

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

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

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

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

  • 警告指出潜在的问题和错误。修复这些而不是忽略它们。
  • 首先不要为您不感兴趣的类别激活内置警告。例如,许多人非常高兴将undef值字符串化为空字符串,并且不想要任何警告。

此处概述的策略不处理致命异常,请Try::Tiny改用。

于 2013-10-21T09:41:32.810 回答
3

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

我认为做这个 FWIW 有完全正当的理由。

于 2016-08-12T13:47:37.057 回答
0

更简单的方法是使用no warnings;See perldoc链接了解更多信息。将给出警告的语句用大括号括起来以消除警告消息。

例如

{
     no warnings;
     <statement giving warning>
}
于 2016-05-23T09:38:18.783 回答