use Carp 'croak'; sub exec_anon { &{$_[0]} } sub boom { eval { croak "$_[0]\->boom" }; print "trace: $@" } exec_anon sub { main->boom }; exec_anon sub { unshift @_, 'main'; goto &{main->can("boom")} }; __output__ trace: main->boom at - line 4 eval {...} called at - line 4 main::boom('main') called at - line 6 main::__ANON__ called at - line 3 main::exec_anon('CODE(0x8107e64)') called at - line 6 trace: main->boom at - line 4 eval {...} called at - line 4 main::boom called at - line 3 main::exec_anon('main', 'CODE(0x8117378)') called at - line 7