2016-11-23 76 views
7

我想从内联C函数中访问perl全局变量(在这种情况下为$数据),但我使用的“数据”变量未定义。 任何想法如何做到这一点?从内联访问全局perl变量C

感谢

下面的代码片段将给出错误提示变量“数据”不宣。

$data = "this is a test"; 
test(); 

use Inline C => <<'END_OF_C_CODE'; 

void test() { 
    printf("here: %s\n", SvPV(data, PL_na)); 
} 

END_OF_C_CODE 

回答

5

使用get_sv(或get_av/get_hv)宏访问以串联/ XS代码全局变量。

package main; 
use Inline C; 
our $Bar = 123; 
test(); 
__DATA__ 
__C__ 
void test() { 
    SV* var = get_sv("Bar", GV_ADD); 
    const char *val = SvPVutf8_nolen(var); 
    printf("Value of $Bar is %s", val); 
} 

GV_ADD标志将创建变量(并初始化为undef),如果它不存在。如果您访问的变量不存在,并且您不使用此标志,则get_sv将返回NULL

如果你正在寻找的变量是在不同的包从main,必须限定它在get_sv电话:

package Foo; 
use Inline C; 
our $Bar = 123; 
test(); 
__DATA__ 
__C__ 
void test() { 
    SV* var = get_sv("Foo::Bar", GV_ADD); /* need "Foo::" now */ 
    const char *val = SvPVutf8_nolen(var); 
    printf("Value of $Foo::Bar is %s", val); 
} 

这在perlguts记录。

+0

谢谢@mob的确切答案! – packetie