Переменная our
-области - это на самом деле просто лексическая переменная (например, my
), которая вместо Scalar
, только что созданного для каждой области действия, - инициализируется связыванием с символом этого имени в Stash
текущего пакета.Так эффективно это:
our $foo;
Делает это:
my $foo := $?PACKAGE.WHO<$foo>;
И так:
our $foo = 42;
Делает это:
(my $foo := $?PACKAGE.WHO<$foo>) = 42;
Повторная привязка символа, таким образом, означает, что он больше не связан с контейнером Scalar
, хранящимся в Stash
.
При экспорте переменной с областью our
экспортируется контейнер Scalar
из тайника, в который переменнаясвязан с временем входа в область.Таким образом, назначение присваивается этому экспортированному контейнеру Scalar
.В отличие от этого, связывание заменяет лексическое на что-то совершенно другое и не связанное с тем, что было экспортировано.
Вот почему вы не можете экспортировать my
-объектную переменную: свежая Scalar
связана с каждымзапись в области видимости, но экспорт - вещь времени компиляции, поэтому не было бы никакого способа изменить экспортируемую вещь.