Этот код выведет «Duo», даже если $ var не является динамической переменной с *
twigil:
our $var="Duo";
sub sub1() {
say $*var;
}
sub1();
#output is 'Duo'
Добавление unit package ABC;
в начале дает ошибку времени компиляции "Динамическая переменная $ * var not found ":
unit package ABC;
our $var="Duo";
sub sub1() {
say $*var;
}
sub1();
# compile time error
Добавление * twigil в этом случае делает переменную доступной.
Почему разница?
Редактировать1:
Использование my
вместо our
является ошибкой времени компиляции с пакетом или без него, даже если в моем понимании это будет означать одинаковую лексическую область действия.
Переменные, которые предназначены для динамического использования, которые должны быть объявлены как таковые (как и все примеры, которые я могу найти).Если да, то как our
позволяет работать выше?Я в замешательстве.
Редактировать 2:
Я думаю, что следующее показывает, почему я в замешательстве:
our $var="non dynamic"; #1
{say $*var;}
our $*var="dynamic"; #2
{say $*var;}
#With #2 commented output is
#non dynamic
#non dynamic
#
#With #2 in place output becomes
#(Any)
#dynamic
В первом случае(# 2 прокомментировал) Я динамически (дважды) обращаюсь к нединамической переменной.
Во втором случае переменная our $var
забивается, когда объявляется our $*var
и разрешается доступ к той же динамической переменнойк двум отдельным переменным.