专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>perl>

perl变量作用域-词法变量(中篇)

百度收藏 QQ搜藏

包变量是全局变量。
对私有变量,必须使用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。

上一篇:perl变量作用域-词法变量(上篇) 下一篇:perl变量作用域-词法变量(下篇)

power by soyo123 2007-2008