Быстрый ответ заключается в том, что 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;
Если вы используете подобный код всякий раз, когда добавляете новые узлы в свою структуру данных, то фактически учитываются только ссылки на корень, находящиеся вне структуры. Это именно то, что вы хотите. Тогда корень и рекурсивно все его потомки будут возвращены, как только исчезнет последняя внешняя ссылка на него.