在这种情况下,为什么未初始化变量的行为/交互与已初始化变量不同:

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
  • 09-25 18:36
    查看更多