Câu trả lời nhanh là Perl 5 thực hiện không phải xử lý tham chiếu vòng một cách tự động. Trừ khi bạn thực hiện các biện pháp rõ ràng trong mã của mình, bất kỳ cấu trúc dữ liệu nào của bạn bao gồm tham chiếu vòng tròn sẽ không được khôi phục cho đến khi chuỗi tạo chúng chết. Đây được coi là một sự cân bằng có thể chấp nhận được ở chỗ nó tránh được sự cần thiết cho việc thu gom rác thời gian chạy sẽ làm chậm quá trình thực thi.
Nếu mã của bạn tạo cấu trúc dữ liệu với tham chiếu vòng tròn (nghĩa là cây có nút chứa tham chiếu về gốc), bạn sẽ muốn sử dụng mô-đun Scalar :: Util để "làm suy yếu" các tham chiếu trỏ ngược về gốc nút. Các tham chiếu yếu này sẽ không thêm vào số tham chiếu của bất kỳ thứ gì chúng trỏ tới, do đó toàn bộ cấu trúc dữ liệu sẽ tự động được phân bổ khi tham chiếu bên ngoài cuối cùng biến mất.
Ví dụ:
use Scalar::Util qw(weaken);
...
my $new_node = { content => $content, root => $root_node };
weaken $new_node->{root};
push @{$root_node->{children}}, $new_node;
Nếu bạn sử dụng mã như thế này bất cứ khi nào bạn thêm các nút mới để cấu trúc dữ liệu của bạn, sau đó các tài liệu tham khảo chỉ vào thư mục gốc được thực tính là những từ bên ngoài của cấu trúc. Đây chính là điều bạn muốn. Sau đó, các gốc, và đệ quy tất cả các con của nó, sẽ được khai hoang ngay khi tham chiếu bên ngoài cuối cùng để nó biến mất.
Nguồn
2015-11-19 22:42:08
Nit: Perl 5 sử dụng tính tham chiếu. Đó là một chương trình thu gom rác thải. – tsee
OK, tôi đã sửa đổi tham chiếu đến bộ sưu tập rác Perl 6. –
Cảm ơn bạn đã cập nhật câu trả lời. NB: Những người thu gom rác cồng kềnh có vẻ như là một ý tưởng khủng khiếp. Một cách tuyệt vời để làm chậm mọi thứ và/hoặc tạo ra hành động đáng ngờ ở khoảng cách khi cắm các bộ thu gom rác, những lời hứa khác nhau về thời gian GC. – tsee