use strict ; use warnings ; our $inner = "SET" ; sub inner { my ($s) = @_ ; print "$s outermost inner \$inner=$inner\n" ; } ; print "outermost start\n" ; inner('') ; buddy('') ; wrapper('') ; buddy('') ; print "outermost end\n" ; sub wrapper { my ($s) = @_ ; print "$s wrapper entered\n" ; inner($s.' ') ; local *inner ### ; print "$s *** separate local\n" ; *inner = sub { my ($s) = @_ ; $inner ||= "NOT SET" ; print "$s innermost inner $inner\n" ; } ; inner($s.' ') ; buddy($s.' ') ; print "$s wrapper exit\n" ; } ; sub buddy { my ($s) = @_ ; print "$s buddy entered\n" ; inner($s.' ') ; print "$s buddy exit\n" ; } ; #### local *inner ; print "$s *** separate local\n" ; *inner