$VAR = "old VAR";
sub func {return ("old func()")}
sub show {printf "VAR='%s', func()='%s'\n", $VAR, func()}
sub redefine {
eval 'sub func {return ("new func()")}';
local ($VAR) = "new VAR";
show();
}
show();
redefine();
show();
####
VAR='old VAR', func()='old func()'
VAR='new VAR', func()='new func()'
VAR='old VAR', func()='new func()'
##
##
$VAR = "old VAR";
$FUNC = sub {return ("old func()")};
sub show {printf "VAR='%s', func()='%s'\n", $VAR, &$FUNC()}
sub redefine {
local ($FUNC) = sub {return ("new func()")};
local ($VAR) = "new VAR";
show();
}
show();
redefine();
show();
##
##
VAR='old VAR', func()='old func()'
VAR='new VAR', func()='new func()'
VAR='old VAR', func()='old func()'