my $exit_sub = sub($) { die @_; }; sub _overwrite_exit { my $package = $_[0]; no warnings 'redefine'; no strict 'refs'; return if(*{"$package\::exit"}{CODE} && *{"$package\::exit"}{CODE} == $exit_sub); #print "\n$package"; *{"$package\::exit"} = $exit_sub; foreach my $entry (keys %{"$package\::"}) { next if($entry !~ s/::$//); _overwrite_exit($entry); } } _overwrite_exit('main'); eval { print 123; exit(123); }; print "Test: $@"; # never reached!