perl:can';t在定义var的位置之前获取全局var

perl:can';t在定义var的位置之前获取全局var,perl,variables,scope,Perl,Variables,Scope,例如: #!/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,它甚至比mai

例如:

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

每个Perl程序的处理基本上有两个阶段:编译阶段和运行阶段。在编译阶段,
my
sub
被处理,因此Perl现在知道您将使用全局可访问的词法变量
%h
。但是它没有被填充,这将发生在运行阶段。但是,
main
在填充
%h
之前被调用。
my
=
是不相关的。在CS行话中,
%h
实际上是在调用
main
之前定义的(
my
)。您正在询问为什么未执行分配(
=

main()
是在分配给
%h
之前执行的,因为
main()
是在代码中分配给
%h
之前找到的

这和

print("abc\n");
print("def\n");
永远不会打印

def
abc

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

main()
是在分配给
%h
之前执行的,因为
main()
是在代码中分配给
%h
之前找到的

这和

print("abc\n");
print("def\n");
永远不会打印

def
abc

它确实知道
%h
,它只是空的。是的,我知道我可以将main()移动到%h之后,然后它就可以工作了,我只是想知道是否有任何文档可以解释perl以这种方式工作的原因和方式。从技术上讲,
%h
main()
的范围内只是空的,但是分配了哈希内存(
hash(0x8fa3370)
在上面的示例中)perlsyn的第一行:“Perl程序由一系列自上而下运行的声明和语句组成。”它按顺序执行您要求的操作。第一个是:运行main。第二个是:填充
%h
。它知道
%h
,它只是空的。是的,我知道我可以移动main()在%h之后,它就可以工作了,我只是想知道是否有任何文档解释perl为什么以及如何以这种方式工作。从技术上讲,
%h
main()
的范围内,只是空的,但是分配了哈希内存(
hash(0x8fa3370)
在上面的示例中)perlsyn中的第一行:Perl程序由一系列自上而下运行的声明和语句组成。“它按顺序执行您要求的操作。第一个是:运行main。第二个是:填充
%h