use strict; use warnings; use Carp; sub foo { bar() }; sub bar { 1/0; } eval { local $SIG{__DIE__} = \&Carp::confess; foo(); 1; } or print $@; __END__ Illegal division by zero at foo.pl line 7. at foo.pl line 7 main::bar() called at foo.pl line 5 main::foo() called at foo.pl line 13 eval {...} called at foo.pl line 11