定义子程序后定义词法变量

时间:2014-12-06 16:21:27

标签: perl subroutine

在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声明变量,则两个子程序都将看到变量。

是错误还是功能?

1 个答案:

答案 0 :(得分:1)

所有未使用my定义的变量都是隐式our(全局/包)变量。所以这是一个功能。 use strict;编译指示会强制您在变量声明中明确使用ourmy

更准确地说,请引用perldoc

  

严格的诉讼

     

如果您访问既未明确声明(使用my,our,state或use vars)也不是完全限定的变量,则会生成编译时错误。 (因为这是为了避免变量自杀问题和微妙的动态范围问题,仅仅局部变量不够好。)