我正在阅读How can I access the ref count of a Perl hash?,并且建议同时使用Devel::Refcount::refcountDevel::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/

10-10 10:49