Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从XS访问存储在perl对象(hash)中的值_Perl_Xs - Fatal编程技术网

从XS访问存储在perl对象(hash)中的值

从XS访问存储在perl对象(hash)中的值,perl,xs,Perl,Xs,我有一个像这样的perl对象(对哈希的引用) sub funcname { #some code } my $o = My::Class->new(); $o->{internal_data} = \&funcname; #I know it is not nice 在XS代码中有$o引用的其他地方,我需要获取$o->{internal_data}的值 /* at some point in XS code */ SV *obj = ... /* $o value p

我有一个像这样的perl对象(对哈希的引用)

sub funcname {
  #some code
}

my $o = My::Class->new();
$o->{internal_data} = \&funcname; #I know it is not nice
在XS代码中有$o引用的其他地方,我需要获取
$o->{internal_data}
的值

/* at some point in XS code */
SV *obj = ... /* $o value passed to a XS function */
SV *func;
...
/* here I do not know how to load $o->{internal_data} value into func */
...
call_sv(func,G_SCALAR);
perl(api | xstut | guts |?)中可能有一些章节。我就是找不到

提前谢谢你的提示

-- kmx

如果您使用的是“标准”对象,那么它在底层只是一个散列,因此您可以使用HV方法。参见例如(事实上,整个perlguts页面对于这个……来说都是很好的读物)

您对对象的SV*是一个引用,因此您可以使用SvRV“取消引用”该对象,将其转换为HV以传递给HV_xxx函数(例如HV_fetch)


祝你好运

SvRV
将从引用中获取散列(作为
SV*
),
MUTABLE\u HV
将其强制转换为an
HV*
HV\u fetchs
将从散列中获取

SV*  self;
SV*  obj_sv;
HV*  obj_hv;
SV** callback_ptr;
SV*  callback;

self = ...;
SvGETMAGIC(self);
if (!SvROK(self))
    croak("Not a reference");

obj_sv = SvRV(self);
if (SvTYPE(obj_sv) != SVt_PVHV)
    croak("Not a reference to a hash");

obj_hv = MUTABLE_HV(obj_sv);

callback_ptr = hv_fetchs(obj_hv, "internal_data", 0);
if (!callback_ptr)
    croak("Malformed object");

callback = *callback_ptr;

@kmx,
可变_HV(sv)
基本上是
(HV*)sv
,但它更安全,因为它会为
常量sv*常量_sv发出错误;可变_HV(const_sv)
。只是出于兴趣:这个功能在哪里记录?我在谷歌上搜索了一下,找到了这个胎面,但我也想阅读一下关于它的文档,但“可变高压”似乎没有在perldocIt中记录,应该在perlapi中记录,但没有(尽管它在一个示例中使用)。在它们所在的源代码中有一些关于它们的文档。