包变量是全局变量。 对私有变量,必须使用my申明。
1. local和my
几乎每个人都知道,有个local函数,它对本地变量有些影响。它到底是什么呢,与my有关系吗?答案简单而奇怪:
my创建本地变量,然而local不这样。
首先,local $x实际做的事是:它存储包变量$x的当前值在一个安全的地方,然后用一个新值替换它,假如没有指定新值,就使用undef代替。当控制离开当前块时,它也会恢复$x的旧值。它影响的是包变量,这个包变量获取了本地值。但包变量总是全局的,local申明的包变量亦无例外。为了显示其区别,请看这个:
$lo = 'global'; $m = 'global'; A();
sub A { local $lo = 'AAA'; my $m = 'AAA'; B(); }
sub B { print "B ", ($lo eq 'AAA' ? 'can' : 'cannot') , " see the value of lo set by A.\n";
print "B ", ($m eq 'AAA' ? 'can' : 'cannot') , " see the value of m set by A.\n"; }
结果会打印:
B can see the value of lo set by A. B cannot see the value of m set by A.
发生了什么?在A函数里的local申明,给包变量$lo赋予了一个新的临时值AAA。旧值global会被存储起来,直到A返回,但在这点之前,A调用了B。B访问$lo的内容没有问题,因为$lo是包变量,包变量总是全局可见的,所以它能见到A设置的AAA值。
与之对照的是,my申明创建了一个新的词法作用域的变量叫做$x,它仅仅在A函数里可见。在A之外,$m保留它的旧意义:它指向包变量$m;其值仍是global。这是B所见到的变量。它不会见到AAA值,因为那个变量是个词法变量,仅仅存在于A里。
2.local有何好处?
因为local实际不创建本地变量,它并非很有用。在上述示例里,假如B碰巧修改了$lo的值,这样A设置的值就被覆盖掉。这点我们确实不想它发生。我们希望每个函数有它自己的变量,它们不会被其他函数触及到。这就是my所能做到的。
为什么会有local呢?答案90%是因为历史原因。早期的perl版本仅有全局变量。local非常容易执行,它作为对本地变量问题的局部解决方案而增加到perl4里。后来在perl5里做了更多工作,真正的本地变量被添加到该语言里。不同于local,新的本地变量以单词my来申明。之所以选择my,是因为它暗示着隐私,也因为它非常短;短小的单词也许会鼓励你使用它来代替local。my也比local运行更快。
何时使用my,以及何时使用local呢?
答案很简单:总使用my,绝不要使用local。 |