为什么 Perl 中的变量不遵循 `package` 语句?

use*_*331 6 perl

考虑以下 Perl 代码:

use strict;
use warnings;
use feature qw(say);

package A;
our $x = 1;

package B;
our $x = 2;

package A;
say $x;

package B;
say $x;
Run Code Online (Sandbox Code Playgroud)

输出是:

2
2
Run Code Online (Sandbox Code Playgroud)

然而,我本来期望:

1
2
Run Code Online (Sandbox Code Playgroud)

为什么$xafterpackage A指的$B::x是而不是$A::x

Sha*_*awn 10

基本上这是一个范围的事情。

文档中our

声明our为包变量声明一个别名,该别名在其整个词法范围内(甚至跨包边界)都可见。输入变量的包是在声明时确定的,而不是在使用时确定的。

第一个our创建了 的$x别名$A::x。第二个重新分配$x为 的别名$B::x,隐藏/替换前一个,以便$x在同一词法范围内进一步使用不合格的(本例中的文件,因为它位于块之外)引用B包变量,无论当前的内容是什么包岛。

根据文档明确允许这种名称重复:

our如果它们位于不同的包中,则允许在同一词法范围内使用相同名称的多个声明。