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