Perl中变量为何不遵循package语句?代码异常输出原因探究
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
问题原因
这是Perl中our声明的特性导致的:
our的作用是在当前词法作用域内,将对应包的变量(如$A::x)别名为裸变量$x。- 当你在
package B中声明our $x = 2时,这个语句会在整个脚本的全局词法作用域内,把$x的别名重新绑定到$B::x,覆盖了之前package A中our $x创建的别名绑定。 - 后续切换回
package A时,直接使用$x会依然指向$B::x,而非$A::x——因为没有重新声明our $x来绑定当前包的变量。
解决方法
在切换到package A后,重新用our $x声明一次,让$x重新绑定到$A::x:
use strict; use warnings; use feature qw(say); package A; our $x = 1; package B; our $x = 2; package A; our $x; # 重新绑定到$A::x say $x; package B; say $x;
此时输出就会符合预期:1和2。
内容的提问来源于stack exchange,提问作者user14473331
相关产品推荐
相关产品推荐

