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
。