Как программа на С может вызвать функцию Perl? - PullRequest
3 голосов
/ 28 ноября 2011

Я вызываю подпрограмму perl из моей программы на C, используя call_pv. У меня есть 2 вопроса:

  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;
}

Ответы [ 2 ]

5 голосов
/ 28 ноября 2011

используйте argv[1] для ввода имени файла, поэтому перед perl_run(my_perl_interpreter); сделайте что-то вроде этого:

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

Что касается возвращаемого значения, вместо POPp вы должны использовать POP для получения значения SV, затем проверить его для определения типа с помощью SvTYPE () и выполнить соответствующую обработку.

Взгляните на http://perldoc.perl.org/perlembed.html и http://perldoc.perl.org/perlcall.html

2 голосов
/ 28 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...