2009-06-26 87 views
3

我想从C库中创建一个Perl哈希。下面是我到目前为止有:如何使用SWIG在C中构建Perl哈希?

static void add_string_to_perl_hash (HV *hv, char * key, char *value) { 

SV *obj = sv_2mortal(newSVpv(value, 0)); 

hv_store(hv, (const char *)key, strlen (key), obj, 0); 

SvREFCNT_inc(obj); 

} 

SV * do_get_test_hash() { 

    static char *foo ="foo"; 
    static char *bar ="bar"; 

    HV *hv; 

    hv = newHV(); 
    add_string_to_perl_hash (hv, "foo", foo); 
    add_string_to_perl_hash (hv, "bar", bar); 

    return sv_2mortal(newRV_noinc((SV*)hv)); 
} 

想出来:我没有得到任何东西,使任何意义对我说:

use testlib; 
use Data::Dumper; 

print Dumper (testlib::do_get_test_hash()); 

$VAR1 = bless(do{\(my $o = 5359872)}, '_p_SV'); 

想法?

回答

2

查看perlxstut的示例6。它创建了一堆散列并将它们添加到数组中。最后,它返回对数组的引用。如果你返回一个散列,它的工作几乎是一样的。

2

我相信你必须把你想返回的值放到堆栈上,而不是从函数返回它,但我习惯于XS而不是SWIG。

+0

这是否意味着我必须使用汇编器将其推入堆栈? (bleah!)还是有其他一些机制? – Leonard 2009-06-27 02:47:52

+1

嗯。在perlguts和perlxstut中阅读更多内容之后,我意识到你正在讨论将它推到Perl堆栈上。我试过 XPUSHs(sv_2mortal(newRV_noinc((SV *)hv))); 但得到该行编译错误: PROC/tools.c:在功能`do_get_test_hash ': PROC/tools.c:306:错误:'SP' 未声明(第一次在这个函数中使用) 不知道这是关于什么... – Leonard 2009-06-27 04:10:12