作者:仙子 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仍未定义。假如要使用它们,仍须通过全名来访问它们。 |