为什么我不能从 Perl 中同一个包中声明的子访问包中声明的变量?
Why i can't access my variable declared in package from sub declared in the same package in Perl?
我不明白为什么不能访问子 mysub
中的变量 $var
。两个包都在同一个文件中定义,与本例完全相同:
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;
在分配给范围为 $var
的文件之前,您调用了 Util::mysub()
几行代码。
如果您的包在一个单独的文件中,use
语句及其隐含的 BEGIN
块将赋予分配优先级。或者,您可以将包定义放在第一位或使用您自己的 BEGIN
块。
您可以访问您的 sub 中的变量,它只是尚未设置。
my
具有 compile-time 和 run-time 行为。在 compile-time 处,它为封闭范围的其余部分声明了一个变量名,从而使 use strict
快乐。当控制流到达声明 时,初始化发生在 run-time 。因为您对 mysub()
的调用发生在控制流到达 my $var = ...
之前,所以在 mysub
中看到的 $var
的值是 undef
并且 perl 发出 "Use of uninitialized value..." 警告。如果您在 之后调用子 my $var = ...
它将被定义并且您会看到该值(并且没有警告)。
我不明白为什么不能访问子 mysub
中的变量 $var
。两个包都在同一个文件中定义,与本例完全相同:
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;
在分配给范围为 $var
的文件之前,您调用了 Util::mysub()
几行代码。
如果您的包在一个单独的文件中,use
语句及其隐含的 BEGIN
块将赋予分配优先级。或者,您可以将包定义放在第一位或使用您自己的 BEGIN
块。
您可以访问您的 sub 中的变量,它只是尚未设置。
my
具有 compile-time 和 run-time 行为。在 compile-time 处,它为封闭范围的其余部分声明了一个变量名,从而使 use strict
快乐。当控制流到达声明 时,初始化发生在 run-time 。因为您对 mysub()
的调用发生在控制流到达 my $var = ...
之前,所以在 mysub
中看到的 $var
的值是 undef
并且 perl 发出 "Use of uninitialized value..." 警告。如果您在 之后调用子 my $var = ...
它将被定义并且您会看到该值(并且没有警告)。