http://www.perlmonks.org?node_id=1155447

Darkwing has asked for the wisdom of the Perl Monks concerning the following question:

Hi, i had the problem that the contents of $@ produced by a failed eval{...} looked wired. It turned out that this was caused by a module that set the $SIG{__DIE__} handler. I then tried this:

use strict; use warnings; # Just to demonstrate the problem: $SIG{__DIE__} = sub {die "[Unwanted stuff] @_"}; eval { local %SIG; die("Something is wrong!\n"); }; print "Got: $@\n";

But i got: Got: [Unwanted stuff]  Something is wrong!. Obviously, the handler is still active inside the eval{...}. Looking at perlmonks i found this http://www.perlmonks.org/?node_id=51097 and changed my code to:

use strict; use warnings; # Just to demonstrate the problem: $SIG{__DIE__} = sub {die "[Unwanted stuff] @_"}; eval { local $SIG{__DIE__}; # No sigdie handler die("Something is wrong!\n"); }; print "Got: $@\n";

Now the output is Got: Something is wrong!, meaning that the handler is switched off, which is the desired result.

But i still do not understand why my fist approach didn't work. Why does local %SIG; not turn off the handler? I expected this to just turn off all handlers. Why do i need to write local $SIG{__DIE__};? Can anybody explain this?