Прежде всего, это не инициализатор; это обычное старое задание. Это происходит, когда код выполняется, а не когда создается переменная.
Во-вторых, 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";
Точнее,
- Compile фазы
- Compile
use strict;
.
- Выполнение
require strict;
.
- Выполнение
import strict;
.
- Компиляция
use warnings;
.
- Выполнение
require warnings;
.
- Выполнение
import warnings;
.
- Компиляция
our($foo) = 0;
. (Только создает $foo
.)
- Compile
BEGIN
блок:
- Compile
$foo = 2;
.
- Выполнить
BEGIN
блок:
- Execute
$foo = 2;
.
- Компиляция
our($bar);
. (Только создает $bar
.)
- Compile
BEGIN
блок:
- Compile
$bar = 3;
.
- Выполнить
BEGIN
блок:
- Execute
$bar = 3;
.
- Компиляция
print "FOO: <$foo>\n";
.
- Компиляция
print "BAR: <$bar>\n";
.
- Продолжительность фазы
- Выполнить
($foo) = 0;
.
- Выполнение
($bar);
.
- Execute
print "FOO: <$foo>\n";
- Выполнить
print "BAR: <$bar>\n";
Как вы можете видеть,
- Вы назначаете
2
к $foo
в 1.9.1, то вы назначаете 0
к $foo
в 2.1.
- Вы назначаете
3
в $bar
в 1.12.1.
Различие между инициализацией и простым назначением является ключом к тому, чтобы помочь мне понять это, а не просто зная об этом - спасибо. –
Не имеет смысла, чтобы 'наш' имел инициализатор, поскольку' наш $ foo' создает псевдонимы с лексической областью для переменной пакета с тем же именем (как '\ my $ foo = \ $ PACKAGE: : foo; 'делает). Тем не менее, это просто назначение для меня. (Почему вы используете 'our' в первую очередь ???) – ikegami
Мне нужна была переменная с областью действия в пакетной области. –