La réponse rapide est que Perl 5 fait pas gérer automatiquement les références circulaires. Sauf si vous prenez des mesures explicites dans votre code, aucune de vos structures de données qui incluent des références circulaires ne sera récupérée tant que le thread qui les a créées ne meurt pas. Ceci est considéré comme un compromis acceptable en ce sens qu'il évite le besoin d'une récupération de place à l'exécution qui ralentirait l'exécution. Si votre code crée des structures de données avec des références circulaires (ie un arbre dont les nœuds contiennent des références à la racine), vous voudrez utiliser le module Scalar :: Util pour "affaiblir" les références qui pointent vers la racine nœud. Ces références faibles n'ajouteront pas au compte de référence de ce qu'elles pointent vers, de sorte que toute la structure de données sera automatiquement désaffectée lorsque la dernière référence externe disparaîtra.
Exemple:
use Scalar::Util qw(weaken);
...
my $new_node = { content => $content, root => $root_node };
weaken $new_node->{root};
push @{$root_node->{children}}, $new_node;
Si vous utilisez le code comme ceci chaque fois que vous ajoutez de nouveaux noeuds à votre structure de données, puis les seules références à la racine qui sont effectivement comptés sont ceux de l'extérieur de la structure. C'est exactement ce que vous voulez. Ensuite, la racine, et récursivement tous ses enfants, seront récupérés dès que la dernière référence externe disparaîtra.
Nit: Perl 5 utilise le comptage de référence. C'est un système de collecte des ordures. – tsee
OK, j'ai modifié la référence à Perl 6 garbage collection. –
Merci d'avoir mis à jour la réponse. NB: Les éboueurs enfichables semblent être une idée horrible. Une excellente façon de ralentir les choses et/ou de produire une action douteuse à distance en branchant des éboueurs qui font des promesses différentes sur le temps du GC. – tsee