如何在Perl散列中存储空值

  • 本文关键字:存储 空值 Perl perl xs
  • 更新时间 :
  • 英文 :


我想在我的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有特殊的常数

&PL_sv_undef是未定义的值,但不幸的是,您不能在散列和数组中天真地使用它。引用perlguts:

一般来说,如果你想在AV或HV中存储一个未定义的值,你不应该使用&PL_sv_undef,而应该使用newSV函数创建一个新的未定义的值,例如:

av_store( av, 42, newSV(0) );
hv_store( hv, "foo", 3, newSV(0), 0 );

&PL_sv_undef undef标量。它是只读的。您可能需要一个 fresh undef标量,就像使用newSV(0) [1]创建的那样。

newSV(0)返回的标量以refcount为1开始,当使用hv_stores将标量存储在其中时,散列"占有",因此不要使用SvREFCNT_decsv_2mortal返回的标量。(如果你把它存储在其他地方,一定要增加引用计数。)


  1. & # x20的;

    # "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
    

相关内容

  • 没有找到相关文章

最新更新