sub localize_and_call_fn { no strict 'refs'; no warnings 'redefine'; my ($locals, $fn, @args) = @_; my $new_fcn = sub { "changed" }; my $globs = join( q{,}, map { "*$_" } @$locals); my $eval_text = << "END_EVAL"; local( $globs ) = ( \$new_fcn ) x \@\$locals; \$fn->(\@args); END_EVAL eval $eval_text; }