Быстрый ответ: Perl 5 делает не автоматически обрабатывает круговые ссылки. Если вы не принимаете явные меры в своем коде, любая из ваших структур данных, которая включает циклические ссылки, не будет исправлена до тех пор, пока нить, которая их создала, не умрет. Это считается приемлемым компромиссом в том, что он позволяет избежать необходимости сбора мусора во время выполнения, что замедлит выполнение.
Если ваш код создает структуры данных с круговыми ссылками (то есть дерево, чьи узлы содержат ссылки назад к корню), вы захотите использовать модуль Scalar :: Util для «ослабления» ссылок, которые обращаются к корню узел. Эти слабые ссылки не будут добавлять к ссылочному счету того, на что они указывают, поэтому вся структура данных будет автоматически освобождена, когда последняя внешняя ссылка исчезнет.
Пример:
use Scalar::Util qw(weaken);
...
my $new_node = { content => $content, root => $root_node };
weaken $new_node->{root};
push @{$root_node->{children}}, $new_node;
Если вы используете код, как это всякий раз, когда вы добавляете новые узлы в вашей структуре данных, то только ссылки на корню, которые на самом деле являются подсчитывались снаружи структуры. Это именно то, что вы хотите. Тогда корень и рекурсивно все его дети будут возвращены, как только последняя внешняя ссылка на него исчезнет.
Nit: Perl 5 использует подсчет ссылок. Это схема сбора мусора. – tsee
ОК, я изменил ссылку на сборку мусора Perl 6. –
Спасибо за обновление ответа. NB: Подключаемые сборщики мусора кажутся ужасной идеей. Отличный способ замедлить работу и/или вызвать сомнительные действия на расстоянии при подключении сборщиков мусора, которые дают разные обещания о времени GC. – tsee