15

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);

印刷するもの:

Anon ARRAY ARRAY(0x8b10818) has 1/1 reference
Anon ARRAY ARRAY(0x8b10818) now has 2/1 references

最後の2/1の不一致に注意してください...

(私が愚かなことをしていないことが判明した場合は、Perlハッシュの参照カウントにアクセスするにはどうすればよいですか?からここにリンクを追加します)

4

2 に答える 2

10

私はまだすべてを理解しているとは言えませんが、あなたの質問はDevel::Refcountperldocで目立つように答えられています

SvREFCNTとの比較

この関数は、SvREFCNT()が渡されたSVオブジェクト自体の参照カウントを提供するのに対し、refcount()はポイントされているオブジェクトのカウントを提供するという点で、Devel :: Peek::SvREFCNTとは異なります。これにより、任意の指示対象(つまり、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()は、参照オブジェクトを指す参照値の数をカウントします。この場合の匿名ARRAY。

CODE参照が作成される前は、$varと$othervarの両方のSvREFCNT()は1です。これは、現在の字句パッドにのみ存在するためです。匿名ARRAYのrefcount()は2です。これは、$varと$othervarの両方がその配列への参照を格納しているためです。

CODE参照が作成された後、$ var変数のSvREFCNT()は2になります。これは、新しい匿名CODEブロックの字句パッドにも表示されるためです。

于 2012-07-05T16:09:05.260 に答える
5

Devel::Refcount::refcount($anon)によって参照されるものの参照カウントを返します$anon

配列は:2$anonによって参照されます。$otherref


Devel::Peek::SvREFCNT($anon)それ自体の参照カウントを返します$anon

スカラーは、それが存在するパッドによって参照されます:1

Devel :: Peekは、配列やハッシュなどの参照カウントを取得する手段を提供していないようです。


$ perl -MDevel::Peek -E'my $aref2 = my $aref1 = []; Dump($aref1);'
SV = IV(0x99eee34) at 0x99eee38
  REFCNT = 1                    <---- Devel::Peek::SvREFCNT
  FLAGS = (PADMY,ROK)
  RV = 0x99d57d0
  SV = PVAV(0x99d6778) at 0x99d57d0
    REFCNT = 2                  <---- Devel::Refcount::refcount
    FLAGS = ()
    ARRAY = 0x0
    FILL = -1
    MAX = -1
    ARYLEN = 0x0
    FLAGS = (REAL)

Internals::SvREFCNTPerlは、スカラー、配列、およびハッシュで機能する、と呼ばれる半サポートの組み込み関数を提供します。

Internals::SvREFCNT(@$anon)それ自体の参照カウントを返します@$anon

配列は:2$anonによって参照されます。$otherref

上記はスカラー、配列、ハッシュに対してのみ機能し、適切な印章を使用する必要があります。任意の参照を渡すだけの場合は、次を使用できます。

&Internals::SvREFCNT($anon) + 1によって参照されるものの参照カウントを返します$anon

配列は:2$anonによって参照されます。$otherref

于 2012-07-05T16:04:29.267 に答える