Когда @a = ({1,2,3}, [1,2,3]);
выходит из области видимости, его счетчик ссылок будет уменьшен на один *.
Когда счетчик ссылок @a
достигнет нуля, счетчик ссылок его значений будет уменьшен на единицу, и он будет освобожден.
Когда счетчик ссылок $a[0]
(ссылка на хеш) достигает нуля, счетчик ссылок ссылочного хеша уменьшается на единицу и освобождается.
Когда счетчик ссылок анонимного хэша достигнет нуля, счетчик ссылок его значений будет уменьшен на единицу, и он будет освобожден.
Когда счетчик ссылок одного из хеш-значений анонима достигает нуля, счетчик ссылок его значений уменьшается на единицу и освобождается.
То же самое относится к $a[1]
, массиву, на который он ссылается, и значениям этого массива.
Вы можете «доказать» это, используя объекты с деструкторами.
$ perl -E'
package X {
sub new { my ($c,$n) = @_; bless(\$n, $c) }
DESTROY { say ${$_[0]}; }
}
{
my @a = (
{ a => X->new(1), b => X->new(2) },
[ X->new(3), X->new(4) ],
);
say "Before end of scope";
}
say "After end of scope";
'
Before end of scope
4
3
2
1
After end of scope
* & mdash; Фактическая реализация отличается как оптимизация.