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

cha*_*par 0 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;
Run Code Online (Sandbox Code Playgroud)

Cha*_*ens 12

从第一段开始perldoc -f our:

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

您的第our一个在当前范围中创建了一个$p1::varnamed 的别名$var.该范围一直运行到文件末尾(package语句不创建新范围).但是你创建了一个新的别名$var($p2::var).因此,别名将持续到范围结束(即文件)或下一次重新定义别名.

如果要限制范围our,请创建新范围:

#!/use/bin/perl

package p1;

use strict;
use warnings;

our $var = 3;

{
    package p2;

    use strict;
    use warnings;

    our $var = 13;
}

print "$var in package ", __PACKAGE__, "\n";

{
    package p2;

    use strict;
    use warnings;

    our $var;

    print "$var in package ", __PACKAGE__, "\n";
}

print "$var in package ", __PACKAGE__, "\n";
Run Code Online (Sandbox Code Playgroud)