使用参数调用perl例程

时间:2014-04-11 15:37:52

标签: c perl xs

我需要在我的C程序中调用perl例程。 perl例程采用以下参数:$a, $b, $c,其中$a$b是整数,$c是一个字符串(可能包含二进制字符)。根据{{​​3}},这是打电话的方式。

I32 call_sv(SV* sv, I32 flags);
I32 call_pv(char *subname, I32 flags);
I32 call_method(char *methname, I32 flags);
I32 call_argv(char *subname, I32 flags, char **argv);

似乎我只能使用call_argv(...),但有两个问题

  • 如何将整数传递给perl例程
  • 如何将(二进制)字符串传递给perl?

希望有一个像

这样的功能
I32 call_argv(char *subname, I32 flags, int numOfArgs, SV* a, SV* b, SV *c ...);

1 个答案:

答案 0 :(得分:8)

请参阅Passing Parameters section of perlcall。参数被推送到Perl堆栈上。 call_argv对于传递除字符串之外的任何内容都没有用。调用约定看起来像

PUSHMARK(SP);
mPUSHi(some_integer);
mPUSHp(binary_data, len);
XPUSHs(some_SV_I_had_laying_around);
PUTBACK;
call_pv("sub_name", G_DISCARD);

或者,如果您在call_svSV*中有子名称,则可以使用call_method在某个对象上按名称调用方法。

如果sub返回一个或多个值,则可以使用G_SCALARG_ARRAY来调用它,并使用POP宏来访问返回值;这将在以下两节中详细介绍。不要忘记SPAGAIN