our $foo = "foo"; { local $foo = "bar"; sub quz { print "\$foo = $foo\n"; } } quz(); # prints "$foo = foo" #### our $foo = "foo"; { $foo = "bar"; sub quz { print "\$foo = $foo\n"; } $foo = "foo"; } quz(); # prints "$foo = foo" #### #!/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 #### our $bar = "BBB"; sub foo { print "orig foo (bar=$bar)\n" } sub bar { print "orig bar (bar=$bar)\n" } { local *foo = sub { print "local foo (bar=$bar)\n"; }; local *bar; # this also clears $bar! sub quz { foo(); eval { bar(); 1 } or warn "calling bar failed: $@"; } sub baz { *bar = sub { print "local bar (bar=$bar)\n"; }; } quz(); # first call to quz (OOPS, $bar is undef!) baz(); # first call to baz quz(); # second call to quz (OOPS, $bar is still undef!) }