if ((fetch_uv(dusr,"T")) < now) { dSP; PUSHMARK(SP); # trgt.s is the key for HV * dusr XPUSHs(sv_2mortal(newSVpv(trgt.s,4))); PUTBACK; call_sv(myperlsub,G_VOID); } in the perl routine, this instruction is executed $x->{trgt}->{T} = 12345; upon return from the perl call_sv, examination of the contents of the sub hash vpp = hv_fetch(hp,trgt.s,1,0); value = SvUVX(*vpp); reveals that the contents appear to contain the initalization value rather than 12345. HOWEVER, if the hash is iterated for(itmp = 0; itmp < iend;itmp++) { he = hv_iternext(dusr); ctmp = hv_iterkey(he,&rtmp); ttmp = SvUV(hv_iterval(dusr,he)); fprintf(stderr,"key %s => %d\n",ctmp,ttmp); } The correct value magically appears