perl:无法在定义变量的地方之前获取全局变量

perl: can't get the global var before the place that var is defined

例如:

#!/usr/bin/perl
use Data::Dumper;

main();

my %h = (
    name => 'abc',
    value => '123',
);

sub main {
    print "Dumping the hash...\n";
    print Dumper(%h);
}

1;

结果是:

Dumping the hash...

所以 perl 可以在 main 实现之前调用它,为什么它不知道全局变量 %h 甚至比 main() 更早定义?

每个 Perl 程序基本上有两个处理阶段:编译阶段和 运行 阶段。在编译阶段,mysub 被处理,因此 Perl 现在知道您将使用全局可访问的词法变量 %h。但是,它没有填充 - 这将在 运行 阶段发生。但是,main%h 被填充之前被调用。

my= 无关。在 CS 术语中,%h 实际上是在调用 main 之前定义的(my)。您问的是为什么未执行分配 (=)。

main()在赋值给%h之前执行,因为在代码中%h赋值之前找到了main()

完全一样的道理
print("abc\n");
print("def\n");

永远不会打印

def
abc