The only way I see is saving the typeglob, destroying it and re-creating it with all but the CODE slot:
use 5.010;
use strict;
our $FOO;
BEGIN {
$FOO = 'still foo';
}
sub FOO () { 'foo' }
BEGIN {
*BAR = *FOO;
say "in BEGIN (1): \$FOO = '$FOO'";
undef *FOO;
say "in BEGIN (2): \$FOO = '$FOO'";
*FOO = *BAR{SCALAR};
undef *BAR;
}
say defined &FOO ? 'subroutine defined' : 'subroutine undef';
say eval 'my $false; FOO if $false; 1'
? 'FOO allowed'
: 'FOO not allowed'
;
say $FOO;
__END__
in BEGIN (1): $FOO = 'still foo'
in BEGIN (2): $FOO = ''
subroutine undef
FOO not allowed
still foo
update: tweaked the code to more closely resemble the OP's.
--shmem
_($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
/\_¯/(q /
---------------------------- \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}