Reputation: 819
In PHP you might use @
in front of function call to suppress warnings returned.
Is there something similar in Perl?
Upvotes: 12
Views: 30107
Reputation: 57640
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.
(A list of all warnings categories can be found here )
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:
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.
Upvotes: 31
Reputation: 573
You could also just run perl -X
and disable all warnings.
I think there are perfectly valid reasons for doing this FWIW.
Upvotes: 3
Reputation: 371
Easier way is to use no warnings;
See perldoc link for more information. Wrap the statement giving warning in curly braces to get rid of the warning message.
E.g.
{
no warnings;
<statement giving warning>
}
Upvotes: 2