在这种情况下,为什么未初始化的变量的行为/交互方式与初始化变量不同:
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
答案 0 :(得分:10)
首先,它不是初始化程序;这是一项普通的旧任务。它在代码执行时发生,而不是在创建变量时发生。
其次,编译块后立即评估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";
如您所见,
2
分配给$foo
,然后在2.1中将0
分配给$foo
。3
分配给1.12.1中的$bar
。