A. Pagaltzis wrote: > * Michael G Schwern <[EMAIL PROTECTED]> [2007-02-27 06:25]: >> $SIG{__DIE__} = sub { >> # We don't want to muck with death in an eval, but $^S isn't >> # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing >> # with it. Instead, we use caller. This also means it runs under >> # 5.004! >> my $in_eval = 0; >> for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { >> $in_eval = 1 if $sub =~ /^\(eval\)/; >> } >> ... >> }; >> >> That's how you do it "right" and maintain any sort of backwards >> compatibility. > > Owh goodnessssss arrrrragh *twitch* > > Together with the contortions required to safely examine $@ after > an eval I’m getting tempted to put Unbreak::Eval on the CPAN.
I was poking around in CGI::Carp and found this: # The mod_perl package Apache::Registry loads CGI programs by calling # eval. These evals don't count when looking at the stack backtrace. sub _longmess { my $message = Carp::longmess(); $message =~ s,eval[^\n]+(ModPerl|Apache)/(?:Registry|Dispatch)\w*\.pm.*,,s if exists $ENV{MOD_PERL}; return $message; } sub ineval { (exists $ENV{MOD_PERL} ? 0 : $^S) || _longmess() =~ /eval [\{\']/m }