use Carp qw(confess); local *foo=sub { confess "What the fook!" }; eval qq[sub bar { confess "What the wook!" } 1 ] or die "failed to eval code: $@"; eval { foo(); 1 } or print $@; eval { bar(); 1 } or print $@; __END__ What the fook! at c:\temp\die.pl line 3 main::__ANON__() called at c:\temp\die.pl line 9 eval {...} called at c:\temp\die.pl line 8 What the wook! at (eval 1) line 1 main::bar() called at c:\temp\die.pl line 13 eval {...} called at c:\temp\die.pl line 12