package App::Tasker::SafeExec; sub _onmatch_fail { my ( $_codetext, $_valhref, $_taskname ) = @_; $_codetext .= "# line 1 task[$_taskname]\n" . $_codetext; { use Safe; my $_compartment = new Safe; our $FAIL_MATCH = 0; # match defaults to succeed my $_epilog = ''; my $_newval = {}; my $_evaltext = <<'EOT'; $_compartment->share('$FAIL_MATCH'); EOT while ( my ( $k, $v ) = each %$_valhref ) { $_evaltext .= <share('\$$k'); EOT $_epilog .= <{'$k'} = \$$k; EOT } $_evaltext .= <<'EOT'; $_compartment->reval($_codetext, 1); die $@ if $@; EOT $_evaltext .= $_epilog; eval $_evaltext; die $@ if $@; for my $k ( keys %$_valhref ) { $_valhref->{$k} = $_newval->{$k}; } return $FAIL_MATCH; } }