in reply to Bug with Carp and $!/$?

I just randomly thought about this again today, and I think I know why $! got reset, and I believe that you are right about the cause.

The require line that you finger is Perl's delayed loading of Carp::Heavy. Loading that involves I/O, compilation, etc. All of which are likely to reset $!.

And indeed you can test it with comparing the output of the following script:

#!/appl/cpc/bin/perl -w use strict; use warnings; use Carp; require Carp::Heavy; # Avoid delayed loading resetting $! $!=10; $?=9; croak "$!: $?";
All things considered I don't think your assumption about Carp was off base. (It was wrong, it is undocumented, but it is a reasonable and possibly useful feature.) I would suggest submitting a patch to Carp that captures $! before the require and then resets it afterwards. Also create a test that checks that $! is preseved through a croak and a confess and submit that as well.