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

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

百度收藏 QQ搜藏

作者:仙子
Perl里其他类型的变量叫做词法变量或私有变量,因为它们是私有的。它们有时也叫做my变量,因为总是以my来申明它们。你也许很想叫它们local变量,因为它们的影响被局限在程序的一小部分里。但不要那样做,因为其他人可能以为你在谈论perl的local操作符。当你想要一个local变量时,请想到my,而不是local。

my $x;

如上申明创建了一个新变量,叫做x,它对程序的大部分完全不可访问,大部分是指在申明变量的代码块之外的地方。这个块叫做变量作用域。假如变量未在任何块里申明,它的作用域就是从申明它的地方开始,到文件的结尾。

也可以申明和初始化一个my变量,这样写:

my $x = 119;

也能同时申明几个变量:

my ($x, $y, $z, @args) = (5, 23, @_);

如下示例展示私有变量在哪里会很有用。考虑这个子程序:

        sub print_report {
          @employee_list = @_;
          foreach $employee (@employee_list) {
            $salary = lookup_salary($employee);
            print_partial_report($employee, $salary);
          }
        }

假如lookup_salary碰巧也使用了名为$employee的变量,这个变量名和print_report使用的一样,事情就会变得糟糕。负责print_report和lookup_salary的2个程序员必须协作,以确保他们不使用相同的变量名。这点是痛苦的。事实上,即使是在一个中等大小的项目里,这点也令人无法忍受。

解决方法是:使用my变量:

        sub print_report {
          my @employee_list = @_;
          foreach my $employee (@employee_list) {
            my $salary = lookup_salary($employee);
            print_partial_report($employee, $salary);
          }
        }

my @employee_list创建一个新的数组变量,它在print_report函数之外完全不可访问。 my $employee创建一个标量变量,它在foreach循环外完全不可访问。你不必担心程序里的其他函数会破坏这些变量,因为它们没这个能力;它们不知道这些变量在哪里,因为变量的名字在my申明的作用域之外有不同的意义。my变量有时也叫做词法变量,因为它们的作用域仅仅依赖于程序文本自身,不依赖于执行细节,例如以什么顺序来执行什么。仅通过检查源代码,就可以弄清楚它们的作用域。无论何时你看到一个变量,请在同一代码块里的先前位置找my申明。假如找到了,你可以确认该变量在代码块之外不可访问。假如在最内层的代码块里没有找到my声明,那就到上一层块里找,依此类推,直到找到为止。假如任何地方都没有my申明,那么这个变量是个包变量。

my变量并非包变量。它们不是包的一部分,并且没有包限定词。当前包不会因为变量的解释方式而受到影响。如下是个例子:

        my $x = 17;

        package A;
        $x = 12;

        package B;
        $x = 20;

        # $x is now 20.
        # $A::x and $B::x are still undefined

在顶部的my $x=17的申明创建了一个新的名为x的词法变量,它的作用域持续到文件结尾。$x的新意义覆盖了默认的意义,默认意义是指$x是当前包的一个包变量。

package A改变了当前包,但因为$x指向了词法变量,而不是包变量,$x=12不会对$A::x有任何影响。类似的,在package B后,$x=20修改了词法变量,而不是任何包变量。

在文件结尾,词法变量$x值为20,包变量$main::x, $A::x, 和$B::x仍未定义。假如要使用它们,仍须通过全名来访问它们。

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

power by soyo123 2007-2008