使用 our 和 BEGIN 块交互声明的变量
Variables declared with our and BEGIN block interactions
在这种情况下,为什么未初始化的变量 behave/interact 与已初始化的变量不同:
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
。
在这种情况下,为什么未初始化的变量 behave/interact 与已初始化的变量不同:
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
。