$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()'