Я не могу сказать, что я все это уже понял, но ответ на ваш вопрос хорошо виден в Devel::Refcount perldoc
СРАВНЕНИЕ С SvREFCNT
Эта функция отличается от Devel::Peek::SvREFCNT тем, что SvREFCNT() возвращает счетчик ссылок на сам объект SV, на который он передается, тогда как refcount() дает счетчик объекта, на который указывает указатель. Это позволяет также подсчитывать любой референт (например, типы ARRAY, HASH, CODE, GLOB и Regexp).
Рассмотрим следующий пример программы:
use Devel::Peek qw( SvREFCNT );
use Devel::Refcount qw( refcount );
sub printcount
{
my $name = shift;
printf "%30s has SvREFCNT=%d, refcount=%d\n",
$name, SvREFCNT($_[0]), refcount($_[0]);
}
my $var = [];
printcount 'Initially, $var', $var;
my $othervar = $var;
printcount 'Before CODE ref, $var', $var;
printcount '$othervar', $othervar;
my $code = sub { undef $var };
printcount 'After CODE ref, $var', $var;
printcount '$othervar', $othervar;
Это производит вывод
Initially, $var has SvREFCNT=1, refcount=1
Before CODE ref, $var has SvREFCNT=1, refcount=2
$othervar has SvREFCNT=1, refcount=2
After CODE ref, $var has SvREFCNT=2, refcount=2
$othervar has SvREFCNT=1, refcount=2
Здесь мы видим, что SvREFCNT() подсчитывает количество ссылок на объект SV, переданных в виде скалярного значения — $var или $othervar соответственно, тогда как refcount() подсчитывает количество ссылок, указывающих на референтный объект — анонимный МАССИВ в этом случае.
До создания ссылки CODE обе переменные $var и $othervar имеют значение SvREFCNT(), равное 1, поскольку они существуют только в текущем лексическом блоке. Анонимный ARRAY имеет значение refcount(), равное 2, потому что и $var, и $othervar хранят ссылку на него.
После создания ссылки CODE переменная $var теперь имеет SvREFCNT(), равную 2, поскольку она также появляется в лексическом блоке для нового анонимного блока CODE.
person
mob
schedule
05.07.2012