I tend to use
warn (and its relatives from
Carp) in production code - debugging by printing to
STDERR since, as has been pointed out elsewhere on this thread, warnings are trappable - indeed, my test harnesses (using
Test::More), attempt to to verify that the code is/isn't doing something unexpected by catching warnings using...
my $WARN;
local $SIG{__WARN__} = sub { $WARN = "@_" };
.
.
my $WARN = '';
some_op();
like($WARN, '/^$/', 'some_op() - no warnings');
Update:
Added example call - for clarity.
A user level that continues to overstate my experience :-))