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!)
}