我正在使用call_pv
从我的C程序调用perl子例程。
我有两个问题:
C程序如何找到定义此子例程的Perl文件?我们可以定义Perl文件名吗?
如果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;
}
答案 0 :(得分: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()检查它以确定类型,而不是POPp,并执行相应的处理。
查看http://perldoc.perl.org/perlembed.html和http://perldoc.perl.org/perlcall.html
答案 1 :(得分:2)
1)call_pv
在Perl中找不到ImageInfo($image)
以外的文件中的subs。您需要一如既往地创建潜艇。
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 ...