从内联C访问全局perl变量

pac*_*tie 7 perl

我试图从内联C函数中访问perl全局变量(在这种情况下是$ data),但我没有定义我使用的"data"变量.知道怎么做吗?

谢谢

以下代码片段会给出错误,抱怨未声明变量"data".

$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
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 5

使用get_sv(或get_av/ get_hv)宏来访问Inline/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);
}
Run Code Online (Sandbox Code Playgroud)

如果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);
}
Run Code Online (Sandbox Code Playgroud)

这是记录在案perlguts.