2011-11-28 49 views
3

我使用call_pv從我的C程序調用perl子例程。 我有2個問題:C程序如何調用Perl函數?

  1. C程序將如何在其中找到Perl的文件該子程序的定義?有什麼地方可以定義Perl文件名嗎?

  2. 如果Perl返回散列引用作爲輸出,我該如何在C中讀取它?

這是我的C函數:

static int call_perl_fn(char* image) 
{ 

dSP; 
int count; 
ENTER; 
SAVETMPS; 
PUSHMARK(SP); 
XPUSHs(sv_2mortal(newSVpv(image, 0))); //parameter to perl subroutine 
PUTBACK; 
count = call_pv("ImageInfo", G_SCALAR); //Invoking ImageInfo subroutine 
SPAGAIN; 
if (count != 1) 
{ 
    printf("ERROR in call_pv"); 
} 
printf("VALUE:%s", (char*)(SvRV(POPp))); //How to read has reference output? 
PUTBACK; 
FREETMPS; 
LEAVE; 

return count; 
} 

回答

5

使用argv[1]把文件名,這樣的perl_run(my_perl_interpreter);之前做這樣的事情:

char *my_argv[] = { "", "NAME_HERE.pl" }; 
perl_parse(my_perl_interpreter, NULL, 2, my_argv, (char **)NULL); 

關於返回值,而不是你應該使用POP來獲得SV值,然後用SvTYPE()檢查它來確定類型,並進行相應的處理。

看看http://perldoc.perl.org/perlembed.htmlhttp://perldoc.perl.org/perlcall.html

+0

......和「負責填實perlapi」關於宏的文檔和函數,用於處理原始數據類型(如SV *,AV *,HV *和朋友)的perl C表示。 – tsee

2

1)call_pv中未找到任何文件超過ImageInfo($image)在Perl做替補。你需要像往常一樣創建子目錄。

2)參考什麼?例如,一個字符串的引用:

SV * rv; 
SV * sv; 
char * buf; 
STRLEN len; 

rv = POPs; 
if (!SvROK(rv)) { 
    ... error ... 
} 

sv = SvRV(rv); 
buf = SvPVutf8(sv, len); # For text. Use SvPVbyte for strings of bytes. 
... 

一個散列的引用會更喜歡:

SV * rv; 
SV * sv; 
HV * hv; 

rv = POPs; 
if (!SvROK(rv)) { 
    ... error ... 
} 

sv = SvRV(rv); 
if (SvTYPE(sv) != SVt_PVHV) { 
    ... error ... 
} 

hv = MUTABLE_HV(sv); 
... Use hv_* functions to look into the hash ... 

perlapi

+0

哈希引用 更新了問題。 – cppcoder

+0

@cppcoder,根據更新進行調整。 – ikegami