sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }
$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect
当第一次调用 foo时,它会看到 $x的全局值为1。当调用 bar并运行 local $x时,将在堆栈上重新定义全局 $x。现在,当从 bar调用 foo时,它看到 $x的新值为2。到目前为止,这并不是很特别,因为如果没有调用 local,同样的事情也会发生。神奇的是,当 bar返回时,我们退出由 local $x创建的动态范围,而以前的全局 $x返回到范围。因此,对于 foo的最后一次调用,$x是1。
#!/usr/bin/perl
sub foo { print ", x is $x\n"; }
sub testdefault { $x++; foo(); } # prints 2
sub testmy { my $x; $x++; foo(); } # prints 1
sub testlocal { local $x = 2; foo(); } # prints 2. new set mandatory
print "Default, everything is global";
$x = 1;
testdefault();
print "My does not affect function calls outside";
$x = 1;
testmy();
print "local is everything after this but initializes a new";
$x = 1;
testlocal();
正如 testlocal 注释中提到的,声明“ local $x;”意味着 $x 现在是 undef