die,
but doesn't exit or
throw an exception.
No message is printed if there is a $SIG{__WARN__}
handler installed. It is the handler's responsibility to deal with the
message as it sees fit (like, for instance, converting it into a
die).
Most handlers must therefore make arrangements to
actually display the warnings that they are not prepared to deal with, by
calling warn
again in the handler. Note that this is quite
safe and will not produce an endless loop, since __WARN__
hooks are not called from inside one.
You will find this behavior is slightly different from that of
$SIG{__DIE__}
handlers (which don't suppress the error text, but can instead call
die
again to change it).
Using a __WARN__
handler provides a powerful way to silence all warnings (even the so-called
mandatory ones). An example:
# wipe out *all* compile-time warnings BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } } my $foo = 10; my $foo = 20; # no warning about duplicate my $foo, # but hey, you asked for it! # no compile-time or run-time warnings before here $DOWARN = 1;
# run-time warnings enabled after here warn "\$foo is alive and $foo!"; # does show up
See the perlvar manpage for details on setting %SIG
entries, and for more examples.