考虑下面的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?
package A
$x
$B::x
$A::x
5q4ezhmt1#
基本上就是个瞄准镜。从the documentation on our开始:our声明为包变量声明了一个别名,该别名在整个词法范围内都可见,甚至在包边界之间也可见。变量输入到哪个包是在声明时确定的,而不是在使用时。our创建的第一个命令使$x成为$A::x的别名。第二个命令将$x重新指定为$B::x的别名,隐藏/替换前一个,以便在同一词法作用域中进一步使用未限定的$x(本例中的文件,因为它在块之外)引用B包变量,无论当前包是什么。以下文档明确允许这种名称重复:如果在不同的包中,则允许在同一词法作用域中使用相同名称的多个our声明。
our
B
3htmauhk2#
our创建词法作用域的变量,该变量Map到声明所在的包中名称相似的变量。
package A; our $x;
相当于
package A; use experimental qw( refalising declared_refs ); my \$x = \$A::x;
随后更改程序包将不起作用。
2条答案
按热度按时间5q4ezhmt1#
基本上就是个瞄准镜。
从the documentation on
our
开始:our
声明为包变量声明了一个别名,该别名在整个词法范围内都可见,甚至在包边界之间也可见。变量输入到哪个包是在声明时确定的,而不是在使用时。our
创建的第一个命令使$x
成为$A::x
的别名。第二个命令将$x
重新指定为$B::x
的别名,隐藏/替换前一个,以便在同一词法作用域中进一步使用未限定的$x
(本例中的文件,因为它在块之外)引用B
包变量,无论当前包是什么。以下文档明确允许这种名称重复:
如果在不同的包中,则允许在同一词法作用域中使用相同名称的多个
our
声明。3htmauhk2#
our
创建词法作用域的变量,该变量Map到声明所在的包中名称相似的变量。相当于
随后更改程序包将不起作用。