C程序如何调用Perl函数?

时间:2011-11-28 03:44:00

标签: c perl

我正在使用call_pv从我的C程序调用perl子例程。 我有两个问题:

  1. C程序如何找到定义此子例程的Perl文件?我们可以定义Perl文件名吗?

  2. 如果Perl返回哈希引用作为输出,我该如何在C中读取它?

  3. 这是我的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;
    }
    

2 个答案:

答案 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.htmlhttp://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 ...

perlapi