Lý do tôi muốn sử dụng các thuê bao ẩn danh thay vì các tên miền được đặt tên là vì tôi muốn xác định các subs này bên trong các thành phần Mason (http://www.masonbook.com/book/chapter-2.mhtml#TOC-ANCHOR-7), không hoạt động tốt với các subs có tên.Có an toàn khi đệ quy gọi một tiểu thư ẩn danh từ người khác?
Ví dụ: nếu tôi viết mã theo cách đó:
my ($first, $second);
$first = sub {
my $val = shift;
print "val: $val";
$second->($val);
};
$second = sub {
my $val = shift;
if (0 < $val) {
$val = $val - 1;
$first->($val);
}
};
$first->(10);
Có bất kỳ dấu hiệu ẩn nào (ví dụ: rò rỉ bộ nhớ, v.v.) trong phương pháp này không?
Như được giải thích bởi @Schwern, bộ nhớ cho những người đăng ký này sẽ không được Perl phát hành, vì có một tham chiếu vòng tròn giữa chúng.
Nhưng cụ thể hơn, việc cấp phát bộ nhớ có tăng trưởng tuyến tính hay không, vì $ val được tăng lên hay không phụ thuộc vào độ sâu ngăn xếp của trình gọi? Bởi vì tôi có thể đặt các subs này trong mason <% once> blocks, và trong trường hợp đó các subs này sẽ được khởi tạo chỉ một lần.
Xin cảm ơn các bạn! Nhưng về cơ bản, nếu tôi định nghĩa các subs ẩn danh bên ngoài vòng lặp, dấu vết bộ nhớ của tôi sẽ không tăng lên? – Yakov
Vòng lặp chỉ phóng đại vấn đề; bạn vẫn phải undef $ đầu tiên hoặc $ thứ hai chức năng để tránh cấu trúc tròn. –
@Yakov Vòng lặp chỉ ở đó để minh họa sự rò rỉ. Nó A) cung cấp một ngữ cảnh từ vựng (nghĩa là khối) trong đó các chương trình con sẽ bị phá hủy khi thoát ra và B) phóng đại rò rỉ bộ nhớ để nó hiển thị trong một công cụ thô như 'ps'. – Schwern