2016-11-23 17 views
7

Bir satır içi C işlevi içinden perl global değişkenine (bu durumda $ data) erişmeye çalışıyorum, ancak kullandığım "data" değişkeni tanımlanmadı. Nasıl yapılacağı hakkında bir fikrin var mı?inline C noktasından global perl değişkenlerine erişim

Teşekkür

Aşağıdaki kod parçası değişkeni "veri" ilan göremediğinden şikayet hatayı verecektir.

$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 

cevap

5

Kullanım Inline/XS kodunda global değişkene erişim için get_sv (veya get_av/get_hv) makro. Zaten mevcut değilse

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 bayrak değişken oluşturmak (ve undef olarak başlatılamadı) olacaktır. Zaten mevcut olmayan bir değişkene erişirseniz ve bu bayrağı kullanmazsanız, get_sv, NULL'u döndürür. Aradığınız değişken main farklı bir pakette ise

, bunu get_sv çağrısında nitelemek gerekir:

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); 
} 

Bu perlguts belgelenmiştir.

+0

Kesin cevap için teşekkürler @mob! – packetie

İlgili konular