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

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -