8

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

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 ...);
4

1 回答 1

8

请参阅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_sv如果您在 中具有子名称,则可以使用SV*,或者call_method在某个对象上按名称调用方法。

如果 sub 返回一个或多个值,那么您可以使用G_SCALARor调用它G_ARRAY并使用POP宏来访问返回值;以下两节对此进行了详细说明。别忘了SPAGAIN

于 2014-04-11T16:47:23.310 回答