How can I
add an array (AV) to a hash (HV) as a hash entry using XS?
For
example:
HV * ln_hash =
NULL;
AV * ln_array =
NULL;
SV *
sv =
NULL;
ln_hash =
(HV *) newHV();
ln_array = (AV *) sv_2mortal((SV *)newAV());
ln_array = (AV *) sv_2mortal((SV *)newAV());
sv = newSVpv("Value
1", 0);
av_store(ln_array,
0, sv);
sv = newSVpv("Value
2", 0);
av_store(ln_array,
1, sv);
hv_store(ln_hash,
"MyKey", 5, newRV_noinc((SV *)ln_array), 0);
XPUSHs((SV *)
ln_hash);
Does not seem to
work quite right...
The dump (using
Devel::Peek) gives me:
SV = PVHV(0x1da6a78)
at 0x1aff15c
REFCNT = 1
FLAGS = (SHAREKEYS)
IV = 1
NV = 0
ARRAY = 0x1ae0080 (0:7, 1:1)
hash quality = 150.0%
KEYS = 1
FILL = 1
MAX = 7
RITER = -1
EITER = 0x0
Elt "MyKey" HASH = 0x5e2ad58
SV = RV(0x1ae9284) at 0x1aff258
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x1aff210
SV = PVAV(0x1afdd40) at 0x1aff210
REFCNT = 1
REFCNT = 1
FLAGS = (SHAREKEYS)
IV = 1
NV = 0
ARRAY = 0x1ae0080 (0:7, 1:1)
hash quality = 150.0%
KEYS = 1
FILL = 1
MAX = 7
RITER = -1
EITER = 0x0
Elt "MyKey" HASH = 0x5e2ad58
SV = RV(0x1ae9284) at 0x1aff258
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x1aff210
SV = PVAV(0x1afdd40) at 0x1aff210
REFCNT = 1
FLAGS =
()
IV = 0
NV = 0
ARRAY = 0x1ae00c4
FILL = 1
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
Elt No. 0
SV = PV(0x1afecd4) at 0x1aff228
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1ae00dc "Value 1"\0
CUR = 7
LEN = 8
Elt No. 1
SV = PV(0x1afecec) at 0x1aff240
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1ae00b4 "Value 2"\0
CUR = 7
LEN = 8
IV = 0
NV = 0
ARRAY = 0x1ae00c4
FILL = 1
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
Elt No. 0
SV = PV(0x1afecd4) at 0x1aff228
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1ae00dc "Value 1"\0
CUR = 7
LEN = 8
Elt No. 1
SV = PV(0x1afecec) at 0x1aff240
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1ae00b4 "Value 2"\0
CUR = 7
LEN = 8
But trying something
like:
my %hash =
Foo::testfunc();
foreach $k ( keys %hash ) {
print "$k: @{ $hash{$k} }\n"
}
gives me error like:
"Bizarre copy of HASH in sassign"
There is definetely
a better way of doing this or I'm probably doing something wrong... should I
return a reference to my hash instead?
Any
ideas?
Thanks,
Christian Cloutier
