How to override exit() call in Perl eval block -
i need eval code in perl might times contain exit() call in it. simplified example of be:
use strict; use warnings; eval "some_function()"; die $@ if $@; print "still alive!\n"; sub some_function { print "hello some_function\n"; exit; } i never "still alive!" because of exit() call.
i tried setting keys in %sig (quit, stop, term, break, etc) didn't work. attempted redefine core::exit no success.
how can prevent exit() call being effective when being evaled?
you can override exit, must @ compile-time. use flag signal whether override active or not.
our $override_exit = 0; begin { *core::global::exit = sub (;$) { die "exit_override\n" if $override_exit; core::exit($_[0] // 0); }; } eval { local $override_exit = 1; some_function(); }; die "exit called\n" if $@ eq "exit_override\n"; die $@ if $@: but creates exception might caught unintentionally. let's use last instead.
our $override_exit = 0; begin { *core::global::exit = sub (;$) { no warnings 'exiting'; last exit_override if $override_exit; core::exit($_[0] // 0); }; } $exit_was_called = 1; exit_override: { local $override_exit = 1; eval { some_function() }; $exit_was_called = 0; die $@ if $@; } die "exit called\n" if $exit_was_called; note eval block used catch exception. eval expr used compile code.
Comments
Post a Comment