2010-03-02 25 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,并从中做数学运算。