我正在阅读如何访问Perl哈希的引用计数?,并有两个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);
Run Code Online (Sandbox Code Playgroud)
打印出:
Anon ARRAY ARRAY(0x8b10818) has 1/1 reference
Anon ARRAY ARRAY(0x8b10818) now has 2/1 references
Run Code Online (Sandbox Code Playgroud)
注意最后2/1的差异......
(如果事实证明我没有做一些愚蠢的事情,我会添加一个链接,如何访问Perl哈希的引用计数?到这里)
我正在尝试修复我的代码以使Perl能够通过削弱引用和打破周期来恢复不需要的数据.
我最近问了一个关于如何访问Perl引用计数的问题,答案对我来说效果很好.
对于我的一些对象,引用计数> 1,我不知道为什么.
有没有办法让我添加一个回调或什么来帮助我知道引用计数何时递增?我想知道谁在引用一个对象.
下面的代码工作正常,但如果我替换push @array,{%hash},push @array,\%hash那么它没有.有人可以帮我理解差异.我相信{%hash}是指匿名哈希.这是否意味着匿名哈希的寿命比对命名哈希(\%hash)的引用要长.
use strict;
use warnings;
use Data::Dumper;
my @array;
my %hash;
%hash = ('a' => 1,
'b' => 2,
'c' => 3,);
push @array,{%hash};
%hash = ('e' => 1,
'f' => 2,
'd' => 3,);
push @array,{%hash};
print Dumper \@array;
Run Code Online (Sandbox Code Playgroud)
产量
$VAR1 = [
{
'c' => 3,
'a' => 1,
'b' => 2
},
{
'e' => 1,
'd' => 3,
'f' => 2
}
];
Run Code Online (Sandbox Code Playgroud)
更新 以下是我正在处理的实际代码.我认为在这种情况下,参考的副本是我认为唯一可行的解决方案.如果我错了,请纠正我.
use …Run Code Online (Sandbox Code Playgroud)