nn4n4s nn4n4s - 6 months ago 8
Perl Question

How can I suppress warnings from a Perl function?

In PHP you might use

@
in front of function call to suppress warnings returned.

Is there something similar in Perl?

Answer

This feature of PHP is crazy and should be avoided whenever possible.

Perl has two kinds of exceptions: Fatal errors and warnings. Warnings may either be emitted by Perl itself, or by user code.

Inside a certain static/lexical scope, Perl's builtin warnings can be switched off like:

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

Output: hello on STDERR.

But this can't be used to remove warnings from code you are calling (dynamic scope). This also doesn't silence user-defined warnings.

In this case, you can write a handler for the __WARN__ pseudo-signal:

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

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

Output: bye on STDOUT.

We can abstract that into a function muffle:

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

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

However, this is an incredibly dumb thing to do:

  • Warnings point to potential problems and bugs. Fix those instead of ignoring them.
  • Don't activate built-in warnings in the first place for categories you aren't interested in. E.g. many people are perfectly happy that an undef value stringifies to the empty string, and don't want any warning for that.

The strategies outlined here do not handle fatal exceptions, use Try::Tiny instead.

Comments