Как я могу отследить ссылки на объекты Perl?

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

Я недавно задал вопрос на том, Как получить доступ к Perl касательно количеств, и ответ работал хорошо на меня.

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

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

7
задан Community 23 May 2017 в 12:11
поделиться

2 ответа

Реализовать пакет 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 оценок операторов).

5
ответ дан 7 December 2019 в 12:19
поделиться

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

0
ответ дан 7 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: