2010-03-02 41 views
7

Tôi đang cố gắng sửa mã của mình để cho phép Perl khôi phục dữ liệu không cần thiết bằng cách làm suy yếu tham chiếu và phá vỡ chu kỳ.Làm cách nào để theo dõi các tham chiếu đến các đối tượng Perl?

Gần đây tôi đã đặt câu hỏi theo số How to access Perl ref counts và câu trả lời đã hoạt động tốt cho tôi.

Đối với một số đối tượng của tôi, số tham chiếu là> 1 và tôi không biết tại sao.

Có cách nào để tôi thêm gọi lại hoặc điều gì đó để giúp tôi biết khi số lượng tham chiếu được tăng lên không? Tôi muốn biết ai đang nói đến một vật thể.

+1

'weaken' không được triển khai dưới dạng" giảm số lượng tham chiếu ", tham chiếu yếu là điều riêng của chúng. – jrockway

Trả lời

5

Triển khai gói Devel::XXX kiểm tra việc đếm số đối tượng của bạn?

package Devel::Something; 
# just emulating Devel::Trace here 
# see http://cpansearch.perl.org/src/MJD/Devel-Trace-0.10/Trace.pm 
sub DB::DB { 
    if ($Devel::Something::CHECK) { 
     my ($package, $file, $linenumber) = caller; 
     ... inspect current refcounts 
     ... if any have changed, print out the details 
     ... including current package/file/linenumber 
     $Devel::Something::CHECK = 0; # disable until it's enabled again 
    } 
} 
1; 

# my program 
... do some stuff ... 
$Devel::Something::CHECK = 1; 
... do some more stuff ... 
$Devel::Something::CHECK = 1; 

$ perl -d:Something my_program.pl ... 

Bạn có thể rắc $Devel::Something::CHECK = 1 báo cáo ở những nơi thích hợp trong suốt mã của bạn, hoặc thay đổi tình trạng này trong DB::DB để chạy đều đặn (ví dụ, if (++$Devel::Something::CHECK % 100 == 0) { kiểm tra sau mỗi lần 100 đánh giá tuyên bố).

+0

+1 Đây là một câu hỏi hay! – tsee

0

Giá trị Perl chỉ theo dõi các tham chiếu bị suy yếu, chứ không theo dõi các tham chiếu yếu của chúng. Dường như không có cách nào để thêm một cuộc gọi lại cho một suy nghĩ như vậy. Bạn sẽ phải tự mình kiểm tra tài khoản và làm toán của bạn từ đó.

Các vấn đề liên quan