ひぃ(hixi)の技術雑記ブログ

事実や解決策というよりも自分が思ったことをつらつらと書いていく所存。文章構成とかそういうのあまり気にせずに書きます

Devel::Peek::Dumpの信用できるところと信用出来ないところ

Devel::Peek::Dumpは同じアドレス空間の変数に対して、IV/NV/PVとかここの要素は更新しないっぽい。 (最後のundefをdumpした時にもIV/NVが存在しているし、SV=XXの部分も更新されない)

#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;
use Devel::Peek;

Test::Devel::dump(2);
Test::Devel::dump(1.1);
Test::Devel::dump(undef);
Test::Devel::dump('a');
Test::Devel::dump(undef);


package Test::Devel;
sub dump {
    my $value = shift;
    Devel::Peek::Dump($value);
}
SV = IV(0x7f82d304e458) at 0x7f82d304e468
  REFCNT = 1
  FLAGS = (PADMY,IOK,pIOK)
  IV = 2
SV = PVNV(0x7f82d3004a30) at 0x7f82d304e468
  REFCNT = 1
  FLAGS = (PADMY,NOK,pNOK)
  IV = 2
  NV = 1.1
  PV = 0
SV = PVNV(0x7f82d3004a30) at 0x7f82d304e468
  REFCNT = 1
  FLAGS = (PADMY)
  IV = 2
  NV = 1.1
  PV = 0
SV = PVNV(0x7f82d3004a30) at 0x7f82d304e468
  REFCNT = 1
  FLAGS = (PADMY,POK,IsCOW,pPOK)
  IV = 2
  NV = 1.1
  PV = 0x7f82d2c0f0f0 "a"\0
  CUR = 1
  LEN = 16
  COW_REFCNT = 1
SV = PVNV(0x7f82d3004a30) at 0x7f82d304e468
  REFCNT = 1
  FLAGS = (PADMY)
  IV = 2
  NV = 1.1
  PV = 0

ちなみに、Cloneとか使ってこうやればIV/NVあたりは初期化される。 が、typeは更新されない。

#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;
use Devel::Peek;
use Clone qw(clone);

Test::Devel::dump(2);
Test::Devel::dump(1.1);
Test::Devel::dump(undef);
Test::Devel::dump('a');
Test::Devel::dump(undef);


package Test::Devel;
sub dump {
    my $value = shift;
    Devel::Peek::Dump(Clone::clone($value));
}
SV = IV(0x7fdcea805dd8) at 0x7fdcea805de8
  REFCNT = 1
  FLAGS = (TEMP,IOK,pIOK)
  IV = 2
SV = PVNV(0x7fdcea804a50) at 0x7fdcea805c38
  REFCNT = 1
  FLAGS = (TEMP,NOK,pNOK)
  IV = 0
  NV = 1.1
  PV = 0
SV = PVNV(0x7fdcea804a50) at 0x7fdcea805de8
  REFCNT = 1
  FLAGS = (TEMP)
  IV = 0
  NV = 0
  PV = 0
SV = PVNV(0x7fdcea804a50) at 0x7fdcea805c38
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x7fdcea4160d0 "a"\0
  CUR = 1
  LEN = 16
SV = PVNV(0x7fdcea804a50) at 0x7fdcea805de8
  REFCNT = 1
  FLAGS = (TEMP)
  IV = 0
  NV = 0
  PV = 0

ってことで、素直にIV/SVとか見たいときは、 FLAGSを見るとか、 以下の様にB::svref_2objectで作ったオブジェクトの中からFLAGSを持って来る必要があるっぽい

B::svref_2object(\$value)->FLAGS;

そして普通に書いてあった!! https://metacpan.org/pod/Devel::Peek#A-simple-scalar-string