我不明白为什么无法访问子$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;
答案 0 :(得分:8)
在分配给作用域Util::mysub()
的文件之前,您可以调用$var
几行。
如果您的软件包位于单独的文件中,use
语句及其隐含的BEGIN
块将赋予分配优先级。或者,您可以先放置包定义,也可以使用自己的BEGIN
块。
答案 1 :(得分:4)
你可以访问sub中的变量,它还没有被设置。
my
具有编译时和运行时行为。在编译时,它为封闭范围的其余部分声明一个变量名,从而使use strict
满意。当控制流到达声明时,初始化在运行时发生。由于您对mysub()
的调用发生在控制流达到my $var = ...
之前,$var
中mysub
的{{1}}值为undef
,并且perl会发出“未初始化的使用价值......“警告。如果您在之后调用了您的子 my $var = ...
它将被定义,而您会看到该值(而不是警告)。