为什么在这种情况下,未初始化的变量的行为/交互与初始化的变量不同:
use strict;
use warnings;
our($foo) = 0;
BEGIN {
$foo = 2;
}
our($bar);
BEGIN {
$bar = 3;
}
print "FOO: <$foo>n";
print "BAR: <$bar>n";
结果在:
$ perl test.pl
FOO: <0>
BAR: <3>
Perl 版本:
$ perl -v
This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
首先,它不是一个初始值设定项;这是一个普通的旧作业。它发生在执行代码时,而不是在创建变量时。
其次,一旦块被编译,BEGIN
块就会被评估。
因此,您编写的内容基本上等效于以下内容:
# Compile phase
use strict;
use warnings;
our $foo;
$foo = 2;
our $bar;
$bar = 3;
# Runtime phase
($foo) = 0;
($bar);
print "FOO: <$foo>n";
print "BAR: <$bar>n";
更准确地说,
- 编译阶段
- 编译
use strict;
. - 执行
require strict;
。 - 执行
import strict;
。 - 编译
use warnings;
. - 执行
require warnings;
。 - 执行
import warnings;
。 - 编译
our($foo) = 0;
.(仅创建$foo
。 - 编译
BEGIN
块:- 编译
$foo = 2;
.
- 编译
- 执行
BEGIN
块:- 执行
$foo = 2;
。
- 执行
- 编译
our($bar);
.(仅创建$bar
。 - 编译
BEGIN
块:- 编译
$bar = 3;
.
- 编译
- 执行
BEGIN
块:- 执行
$bar = 3;
。
- 执行
- 编译
print "FOO: <$foo>n";
. - 编译
print "BAR: <$bar>n";
.
- 编译
- 运行时阶段
- 执行
($foo) = 0;
。 - 执行
($bar);
。 - 执行
print "FOO: <$foo>n";
- 执行
print "BAR: <$bar>n";
- 执行
如您所见,
- 在 1.9.1 中将
2
分配给$foo
,然后在 2.1 中将0
分配给$foo
。 - 在 1.12.1 中将
3
分配给$bar
。