为什么我无法从Perl中相同包中声明的sub访问我在包中声明的变量?

时间:2016-01-11 14:40:12

标签: perl package

我不明白为什么无法访问子$var中的变量mysub。这两个包都在同一个文件中完全定义:

use warnings;
use strict;

Util::mysub();

package Util;

use warnings;
use strict;

my $var = 'i have a value!';

# prints 'var in package: i have a value!'
print "var in package: $var\n";

sub mysub {
    # generates warning 'Use of uninitialized value $var...'
    print "var in sub: $var\n";
}

1;

2 个答案:

答案 0 :(得分:8)

在分配给作用域Util::mysub()的文件之前,您可以调用$var几行。

如果您的软件包位于单独的文件中,use语句及其隐含的BEGIN块将赋予分配优先级。或者,您可以先放置包定义,也可以使用自己的BEGIN块。

答案 1 :(得分:4)

你可以访问sub中的变量,它还没有被设置。

my具有编译时和运行时行为。在编译时,它为封闭范围的其余部分声明一个变量名,从而使use strict满意。当控制流到达声明时,初始化在运行时发生。由于您对mysub()的调用发生在控制流达到my $var = ...之前,$varmysub的{​​{1}}值为undef,并且perl会发出“未初始化的使用价值......“警告。如果您在之后调用了您的子 my $var = ...它将被定义,而您会看到该值(而不是警告)。