our用法如下:
our TYPE EXPR : ATTRIBUTES
our EXPR : ATTRIBUTES
our TYPE EXPR
our EXPR一个 our 声明一个或多个在当前闭合块,文件或者 eval 里有效的全局变量。也就是说,our 和 my 声明在可视性判断上有着一样的规则,只不过不创建一个新的私有变量;它仅仅是允许对 现有包全局变量的无限制的访问。如果列出了多于一个数值,那么该列表必须放在圆括弧里。
使用 out 声明的一个主要用途就是隐藏变量,使之免于 use strict "vars" 声明的影响;因为 该变量伪装成了一个 my 变量,所以就允许你使用声明了的全局变量而不必使用带着包名的全称。 不过,和 my 声明一样,它只能在 our 声明的词法范围里生效。在这方面,它和 use vars 不一样,后者会影响整个包,而不仅仅是词法范围。
our 和 my 类似的地方还有就是你可以带着 TYPE 和 ATTRIBUTE 声明变量。下面是语法:
our Dog $spot :ears(short) :tail(long);到我们写这些的时候,它的含义还不是非常清楚。属性可以影响 $spot 的全局的或者局部的含义。 一方面,它又很象用属性的 my 变量,把当前 $spot 的局部外观封装起来而又不干涉该全局量 在其他地方的外观。另一方面,如果一个模块把 $spot 声明为 Dog,而另外一个模块把 $spot 声明为 Cat,那么最后你就可能会有喵喵叫的狗和汪汪叫的猫。这是一个需要研究的课题,当然 这只不过是我们不知道该说些什么的有趣的说法而已。
our 和 my 相似的另外一个地方就是可视性。一个 our 声明一个全局变量,该变量将在其整个 词法范围都可见,甚至是跨包的边界。该变量位于哪个包是用声明的位置判断的,而不是在使用的 位置。这意味着下面的行为是有问题的并且是注定要失败的:
package Foo;
our $bar; # 对于剩下的词法范围而言,$bar 是 $Foo::bar
$bar = 582;
package Bar;
print $bar; # 打印 582,就好象"our"是"my"一样不过,my 会创建一个新的,私有的变量而 our 暴露一个现有的全局变量,这个区别非常重要, 特别是在赋值的时候。如果你把一个运行时赋值和一个 our 声明结合起来,那么该全局变量的 值不会在 our 超出范围之后消失。如果希望它消失,你应该使用 local:
($x, $y) = ("one", "two");
print "before block, x is $x, y is $y\n";
{
our $x = 10;
local our $y = 20;
print "in block, x is $x, y is $y\n";
}
print "past block, x is $x, y is $y\n";打印出:
before block, x is one, y is two
in block x is 10, y is 20
past block, x is 10, y is two在同一个词法范围里多个 our 声明是允许的,条件是它们在不同的包里。如果它们碰巧在同一个包 里,Perl 会应你之邀发出警告。
use warnings;
package Foo;
our $bar; # 为剩余的词法范围声明 $Foo::bar
$bar = 20;
package Bar;
our $bar = 30; # 为剩余的词法范围声明 $Foo::bar
print $bar; # 打印 30
our $bar; # 发出警告
评论
0评论加载中…