From the Camel Book -
The routine indicated by $SIG{__DIE__} is called when a fatal exception is about to be thrown.
The error message is passed as the first argument.
When a __DIE__ hook routine returns, the exception processing continues as it would have in the absence of the hook, unless the hookroutine itself exits via a goto, a loop exit, or a die.
The __DIE__ handler is explicitly disabled during the call, so that you yourself can then call the real die from a __DIE__ handler.
(If it weren't disabled, the handler would call itself recursively forever.) The case is similar for __WARN__.
When you call die "something" the sub ref'ed in $SIG{__DIE__} is called (you have an anonymous sub in your code). So the top-down approach is broken because your die called the subroutine with your die text as the first arg. If you modify your code to something like this, you will see what is going on -
#!/usr/bin/perl
use strict;
use warnings;
local $SIG{'__DIE__'} = sub { (my $x = $_[0]) =~ s/foo/bar/g; print $x
+; die $x; };
eval { die "foo lives here" };
print "got here\n";
Output
bar lives here at testme line 7.
got here
As you can see foo changed to bar. Also the program prints got here becaue die was called from an eval block.
As an exercise try deleting eval (just the word from the above code) see what happens -
cheers
SK |