我正在阅读How can I access the ref count of a Perl hash?,并且建议同时使用Devel::Refcount::refcount
和Devel::Peek::SvREFCNT
。
但是它们不会返回相同的引用计数。这是为什么?
这是来自perldoc Devel::Refcount
的修改示例:
use Devel::Peek;
use Devel::Refcount;
my $anon = [];
printf "Anon ARRAY $anon has %d/%d reference\n",
Devel::Refcount::refcount($anon),
Devel::Peek::SvREFCNT($anon);
my $otherref = $anon;
printf "Anon ARRAY $anon now has %d/%d references\n",
Devel::Refcount::refcount($anon),
Devel::Peek::SvREFCNT($anon);
输出:
Anon ARRAY ARRAY(0x8b10818) has 1/1 reference
Anon ARRAY ARRAY(0x8b10818) now has 2/1 references
注意最后的2/1差异...
(如果事实证明我没有做任何愚蠢的事情,我将添加一个从How can I access the ref count of a Perl hash?到此处的链接)
最佳答案
我不能说我已经全部掌握了,但是您的问题在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块的词汇栏中。
关于perl - perl:为什么Devel::Refcount::refcount和Devel::Peek::SvREFCNT不同意?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11344518/