2010-03-02 16 views
7

Estoy tratando de arreglar mi código para permitir que Perl recupere los datos innecesarios al debilitar las referencias y los ciclos de interrupción.¿Cómo puedo rastrear referencias a objetos Perl?

Hace poco hice una pregunta sobre How to access Perl ref counts y la respuesta ha funcionado bien para mí.

Para algunos de mis objetos, el recuento de referencias es> 1 y no sé por qué.

¿Hay alguna manera de agregar una devolución de llamada o algo para ayudarme a saber cuándo se incrementa el recuento de referencias? Quiero saber quién hace referencia a un objeto.

+1

'weaken' no se implementa como" disminuir el recuento de referencias ", las referencias débiles son suyas. – jrockway

Respuesta

5

¿Implementa un paquete Devel::XXX que inspecciona los recuentos de tus objetos?

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

Se puede espolvorear $Devel::Something::CHECK = 1 declaraciones en lugares adecuados a lo largo de su código, o cambiar la condición en la DB::DB se ejecute a intervalos regulares (por ejemplo, if (++$Devel::Something::CHECK % 100 == 0) { para inspeccionar después de cada 100 evaluaciones de declaraciones).

+0

+1 ¡Este es uno bueno! – tsee

0

Los valores de Perl solo hacen un seguimiento de sus referencias débiles, no las más difíciles. Parece que no hay forma de agregar una devolución de llamada para tal pensamiento. Tendrá que verificar los recuentos usted mismo y hacer sus cálculos a partir de eso.

Cuestiones relacionadas