在Perl中,如果在声明子例程后尝试用my
词法声明变量,则此子例程将不会看到此变量。但是,在变量之后声明的子程序将看到变量:
sub lol {
if (@arr) {
print "defined\n";
} else {
print "not defined\n";
}
}
my @arr = (1,2,3);
sub lol2 {
if (@arr) {
print "defined\n";
} else {
print "not defined\n";
}
}
lol; #prints "not defined"
lol2; #prints "defined"
但是,如果设置变量而不声明它(@arr = (1,2,3);
)或使用our
声明变量,则两个子程序都将看到变量。
是错误还是功能?
答案 0 :(得分:1)
所有未使用my
定义的变量都是隐式our
(全局/包)变量。所以这是一个功能。 use strict;
编译指示会强制您在变量声明中明确使用our
或my
。
更准确地说,请引用perldoc
严格的诉讼
如果您访问既未明确声明(使用my,our,state或use vars)也不是完全限定的变量,则会生成编译时错误。 (因为这是为了避免变量自杀问题和微妙的动态范围问题,仅仅局部变量不够好。)