#!/usr/bin/env perl use warnings; use strict; sub foo { print "orig foo\n" } sub bar { print "orig bar\n" } { local *foo = sub { print "local foo\n"; }; local *bar; sub quz { foo(); eval { bar(); 1 } or warn "calling bar failed: $@"; } sub baz { *bar = sub { print "local bar\n"; }; } quz(); # first call to quz baz(); # first call to baz quz(); # second call to quz } quz(); # third call to quz baz(); # second call to baz quz(); # fourth call to quz __END__ Subroutine main::foo redefined at local_ex.pl line 8. local foo calling bar failed: Undefined subroutine &main::bar called at local_ex.pl line 12. local foo local bar orig foo orig bar Subroutine main::bar redefined at local_ex.pl line 15. orig foo local bar