2010-03-02 26 views
7

我試圖修復我的代碼,使Perl可以通過削弱引用和打破循環來恢復不需要的數據。如何跟蹤對Perl對象的引用?

我最近問了一個關於How to access Perl ref counts的問題,答案一直適用於我。

對於我的一些對象,引用計數大於1,我不知道爲什麼。

有沒有辦法讓我添加回調或什麼東西來幫助我知道引用計數何時遞增?我想知道誰在引用一個對象。

+1

'weaken'沒有實現爲「遞減引用計數」,弱引用是他們自己的事情。 – jrockway 2010-03-02 18:23:02

回答

5

執行Devel::XXX包檢查對象的refcounts?

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 ... 

你可以灑在適當的地方$Devel::Something::CHECK = 1陳述整個代碼,或更改條件DB::DB每隔一段時間(如if (++$Devel::Something::CHECK % 100 == 0) {後每個檢查運行100個聲明評估)。

+0

+1這是一個不錯的! – tsee 2010-03-02 20:06:27

0

Perl值只跟蹤他們的弱引用,而不是他們的硬引用。似乎沒有辦法爲這種想法添加回調。你必須自己檢查refcounts,並從中做數學運算。