为什么Perl中的变量不遵守'package'语句?

1bqhqjot  于 2023-01-02  发布在  Perl
关注(0)|答案(2)|浏览(142)

考虑下面的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;

输出为:

2
2

不过,我本来会预料到:

1
2

为什么package A后面的$x引用$B::x而不是$A::x

5q4ezhmt

5q4ezhmt1#

基本上就是个瞄准镜。
the documentation on our开始:
our声明为包变量声明了一个别名,该别名在整个词法范围内都可见,甚至在包边界之间也可见。变量输入到哪个包是在声明时确定的,而不是在使用时。
our创建的第一个命令使$x成为$A::x的别名。第二个命令将$x重新指定为$B::x的别名,隐藏/替换前一个,以便在同一词法作用域中进一步使用未限定的$x(本例中的文件,因为它在块之外)引用B包变量,无论当前包是什么。
以下文档明确允许这种名称重复:
如果在不同的包中,则允许在同一词法作用域中使用相同名称的多个our声明。

3htmauhk

3htmauhk2#

our创建词法作用域的变量,该变量Map到声明所在的包中名称相似的变量。

package A;

our $x;

相当于

package A;

use experimental qw( refalising declared_refs );

my \$x = \$A::x;

随后更改程序包将不起作用。

相关问题