我想在我的C代码(XS)中使用Perl哈希作为一个集合,所以我只需要将密钥保存在哈希中。是否可以存储类似null或其他常量值的东西以避免产生不必要的值?
这样的事情:
int add_value(HV *hash, SV *value)
{
// just an example of key
char key[64];
sprintf(key, "%p", value);
if (hv_exists(hash, key, strlen(key)) return 0;
// here I need something instead of ?
return hv_stores(hash, key, ?) != NULL;
}
可能的解决方案之一可能是存储值本身,但可能有undef
或null的特殊常量。
答案 0 :(得分:4)
&PL_sv_undef
是未定义的值,但不幸的是,你不能在哈希和数组中天真地使用它。引用perlguts:
通常,如果要在AV或HV中存储未定义的值,则不应使用&amp; PL_sv_undef,而是使用newSV函数创建新的未定义值,例如: < / p>
av_store( av, 42, newSV(0) );
hv_store( hv, "foo", 3, newSV(0), 0 );
答案 1 :(得分:3)
&PL_sv_undef
undef标量。它是只读的。你可能想要使用newSV(0)
[1] 创建的 a 新的undef标量。
newSV(0)
返回的标量以引用的引号开头,其中哈希&#34;占有&#34;当标量使用hv_stores
存储在其中时,请不要SvREFCNT_dec
或sv_2mortal
返回标量。 (如果您将其存储在其他位置,请增加引用计数。)
# "The" undef (A specific read-only variable that will never get deallocated)
$ perl -MDevel::Peek -e'Dump(undef)'
SV = NULL(0x0) at 0x3596700
REFCNT = 2147483641
FLAGS = (READONLY,PROTECT)
# "An" undef (It's not the type of SVt_NULL that make it undef...)
$ perl -MDevel::Peek -e'Dump($x)'
SV = NULL(0x0) at 0x1bb7880
REFCNT = 1
FLAGS = ()
# Another undef (... It's the lack of "OK" flags that make it undef)
$ perl -MDevel::Peek -e'$x="abc"; $x=undef; Dump($x)'
SV = PV(0x3d5f360) at 0x3d86590
REFCNT = 1
FLAGS = ()
PV = 0