为什么我不能从 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 = ... 它将被定义并且您会看到该值(并且没有警告)。