在这种情况下,为什么未初始化变量的行为/交互与已初始化变量不同:
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";
如你看到的,
2
分配给$foo
,然后在2.1中将0
分配给$foo
。 3
分配给$bar
。