使用my()时,为什么不能获得正确的包变量?

时间:2009-08-31 05:04:33

标签: perl

以下程序会打印“var = 13”和“var = 13”。它不应该打印“var = 3”和“var = 13”吗?

use warnings;
use strict;

package p1;
our $var = 3;

package p2;
our $var = 13;
sub temp
{
    package p2;
    print "var = $var\n";
}

package p1;
print "var = $var\n"; #This prints var = 13. Why is it picking p2::var as the current package is p1?

&p2::temp;

1 个答案:

答案 0 :(得分:12)

perldoc -f our的第一段开始:

  

our将一个简单名称与当前包中的包变量相关联,以便在当前范围内使用。当使用strict 'vars'生效时,我们允许您使用声明的全局   在our声明的词法范围内,没有用包名限定它们的变量。通过这种方式,我们与use vars不同,后者是包作用域。

您的第一个our在当前范围内创建名为$p1::var的{​​{1}}别名。该范围一直运行到文件末尾($var语句不创建新范围)。但随后您为package$var)创建了一个新别名。因此别名会持续到范围结束(即文件)或下一次重新定义别名。

如果您想限制$p2::var的范围,请创建一个新范围:

our