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 程序基本上有两个处理阶段:编译阶段和 运行 阶段。在编译阶段,my
和 sub
被处理,因此 Perl 现在知道您将使用全局可访问的词法变量 %h
。但是,它没有填充 - 这将在 运行 阶段发生。但是,main
在 %h
被填充之前被调用。
my
和 =
无关。在 CS 术语中,%h
实际上是在调用 main
之前定义的(my
)。您问的是为什么未执行分配 (=
)。
main()
在赋值给%h
之前执行,因为在代码中%h
赋值之前找到了main()
。
和
完全一样的道理
print("abc\n");
print("def\n");
永远不会打印
def
abc
例如:
#!/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
。但是,它没有填充 - 这将在 运行 阶段发生。但是,main
在 %h
被填充之前被调用。
my
和 =
无关。在 CS 术语中,%h
实际上是在调用 main
之前定义的(my
)。您问的是为什么未执行分配 (=
)。
main()
在赋值给%h
之前执行,因为在代码中%h
赋值之前找到了main()
。
和
完全一样的道理print("abc\n");
print("def\n");
永远不会打印
def
abc