Недавно я заметил, что повторная инициализация динамических переменных не имеет семантики, которую я ожидал в большинстве случаев с использованием присваивания (однако привязка работает так, как я ожидал).
В частности, в этом коде:
sub g {
my $*i = CALLERS::<$*i> // 0;
my $*a1 = CALLERS::<$*a1> // Array.new;
my @*a2 = CALLERS::<@*a2> // Array.new;
$*i++;
$*a1.push: 'v1';
@*a2.push: 'v2';
dd $*i;
dd $*a1;
dd @*a2;
}
sub f {
my $*i = 0;
my $*a1 = Array.new;
my @*a2 = Array.new;
g; g; g;
}
f
Я ожидал вывода 3
, ["v1", "v1", "v1"]
и ["v2", "v2", "v2"]
, но вместо этого получил 1
, $["v1", "v1", "v1"]
, ["v2"]
. Переключение на привязку решает проблему, так что я не пытаюсь решить проблему, но мне бы очень хотелось понять, почему присваивание здесь не работает. Я заметил, что Scalar, указывающий на Array, работает, а Scalar, указывающий на Int, — нет. Но в любом случае я бы подумал, что вновь назначенная переменная получит значение от CALLERS. Что мне не хватает в семантике присваивания?