=over

=item warn LIST
X<warn> X<warning> X<STDERR>

Prints the value of LIST to STDERR.  If the last element of LIST does
not end in a newline, it appends the same file/line number text as
L<C<die>|/die LIST> does.

If the output is empty and L<C<$@>|perlvar/$@> already contains a value
(typically from a previous eval) that value is used after appending
C<"\t...caught"> to L<C<$@>|perlvar/$@>.  This is useful for staying
almost, but not entirely similar to L<C<die>|/die LIST>.

If L<C<$@>|perlvar/$@> is empty, then the string
C<"Warning: Something's wrong"> is used.

No message is printed if there is a L<C<$SIG{__WARN__}>|perlvar/%SIG>
handler
installed.  It is the handler's responsibility to deal with the message
as it sees fit (like, for instance, converting it into a
L<C<die>|/die LIST>).  Most
handlers must therefore arrange to actually display the
warnings that they are not prepared to deal with, by calling
L<C<warn>|/warn LIST>
again in the handler.  Note that this is quite safe and will not
produce an endless loop, since C<__WARN__> hooks are not called from
inside one.

You will find this behavior is slightly different from that of
L<C<$SIG{__DIE__}>|perlvar/%SIG> handlers (which don't suppress the
error text, but can instead call L<C<die>|/die LIST> again to change
it).

Using a C<__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 L<perlvar> for details on setting L<C<%SIG>|perlvar/%SIG> entries
and for more
examples.  See the L<Carp> module for other kinds of warnings using its
C<carp> and C<cluck> functions.

=back