Как я могу отслеживать ссылки на объекты Perl? - PullRequest
7 голосов
/ 02 марта 2010

Я пытаюсь исправить свой код, чтобы Perl мог восстанавливать ненужные данные, ослабляя ссылки и прерывая циклы.

Я недавно задал вопрос по Как получить доступ к подсчетам ссылок Perl , и ответ мне помог.

Для некоторых моих объектов счетчик ссылок> 1, и я не знаю почему.

Есть ли способ добавить обратный вызов или что-то, что поможет мне узнать, когда счетчик ссылок увеличивается? Я хочу знать, кто ссылается на объект.

Ответы [ 2 ]

5 голосов
/ 02 марта 2010

Реализовать пакет Devel::XXX, который проверяет учет ваших объектов?

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 голосов
/ 02 марта 2010

Значения Perl отслеживают только слабые ссылки, а не жесткие. Кажется, нет никакого способа добавить обратный вызов для такой мысли. Вы должны будете сами проверить эти счета и сделать из этого математику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...