问题描述
我正在阅读 我如何访问Perl 哈希的引用计数?,并且建议使用 Devel::Refcount::refcount
和 Devel::Peek::SvREFCNT
.>
但它们不会返回相同的引用计数.这是为什么?
这里是 perldoc Devel::Refcount
的修改示例:
use Devel::Peek;使用开发::引用计数;我的 $anon = [];printf "匿名数组 $anon 有 %d/%d 个引用\n",开发::引用计数::引用计数($anon),开发::窥视::SvREFCNT($anon);我的 $otherref = $anon;printf "Anon ARRAY $anon 现在有 %d/%d 个引用\n",开发::引用计数::引用计数($anon),开发::窥视::SvREFCNT($anon);
打印出来:
Anon ARRAY ARRAY(0x8b10818) 有 1/1 引用Anon ARRAY ARRAY(0x8b10818) 现在有 2/1 个引用
注意最后 2/1 的差异...
(如果事实证明我没有做蠢事,我将添加来自 如何访问 Perl 哈希的引用计数? 到这里)
我不能说我已经完全理解了,但是您的问题在 Devel::Refcount
perldoc
与 SvREFCNT 的比较
此函数与 Devel::Peek::SvREFCNT 的不同之处在于,SvREFCNT() 给出传递的 SV 对象本身的引用计数,而 refcount() 给出所指向对象的计数.这允许它也给出任何引用的计数(即 ARRAY、HASH、CODE、GLOB 和 Regexp 类型).
考虑以下示例程序:
使用 Devel::Peek qw( SvREFCNT );使用 Devel::Refcount qw( refcount );子打印计数{我的 $name = shift;printf "%30s 有 SvREFCNT=%d, refcount=%d\n",$name, SvREFCNT($_[0]), refcount($_[0]);}我的 $var = [];printcount '最初,$var',$var;我的 $othervar = $var;printcount '在代码引用之前,$var',$var;打印计数 '$othervar', $othervar;我的 $code = sub { undef $var };printcount '在代码引用之后,$var',$var;打印计数 '$othervar', $othervar;
这会产生输出
最初,$var 有 SvREFCNT=1,refcount=1在 CODE ref 之前,$var 有 SvREFCNT=1,refcount=2$othervar 有 SvREFCNT=1,refcount=2在 CODE ref 之后,$var 有 SvREFCNT=2, refcount=2$othervar 有 SvREFCNT=1,refcount=2
在这里,我们看到 SvREFCNT() 计算对作为标量值传入的 SV 对象的引用数量 - 分别为 $var 或 $othervar,而 refcount() 计算指向所指对象的引用值的数量对象 - 在本例中为匿名数组.
在构建 CODE 引用之前,$var 和 $othervar 的 SvREFCNT() 都为 1,因为它们仅存在于当前词法垫中.匿名数组的 refcount() 为 2,因为 $var 和 $othervar 都存储了对它的引用.
在构造 CODE 引用之后,$var 变量现在的 SvREFCNT() 为 2,因为它也出现在新匿名 CODE 块的词法垫中.
I was reading How can I access the ref count of a Perl hash?, and there both Devel::Refcount::refcount
and Devel::Peek::SvREFCNT
are suggested.
But they don't return the same reference counts. Why is that?
Here a modified example from 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);
which prints out:
Anon ARRAY ARRAY(0x8b10818) has 1/1 reference
Anon ARRAY ARRAY(0x8b10818) now has 2/1 references
Notice the last 2/1 discrepancy...
(If it turns out I'm not doing something stupid, I'll add a link from How can I access the ref count of a Perl hash? to here)
I can't say that I grok all of it yet, but your question is answered prominently in the Devel::Refcount
perldoc
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
这篇关于perl:为什么 Devel::Refcount::refcount 和 Devel::Peek::SvREFCNT 不一致?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!