聘我网

新概念招聘3.0

如何在C中嵌入Perl解析器,哪有完整案例?

vote up0vote downstar

rt...

 

2 个答复

vote up0vote downcheck
#include <EXTERN.h>               /* from the Perl distribution     */
#include <perl.h>                 /* from the Perl distribution     */

static PerlInterpreter *my_perl;

int main (int argc, char **argv, char **env)
{
    STRLEN n_a;
    char *embedding[] = { "", "-e", "0" };

    /** Initialize **/
    my_perl = perl_alloc();
    perl_construct( my_perl );

    /** Run **/
    perl_parse(my_perl, NULL, 3, embedding, NULL);
    perl_run(my_perl);

    /** Treat $a as an integer **/
    eval_pv("$a = 3; $a **= 2", TRUE);
    printf("a = %d\n", (int)SvIV(get_sv("a", FALSE)));

    /** Treat $a as a float **/
    eval_pv("$a = 3.14; $a **= 2", TRUE);
    printf("a = %f\n", SvNV(get_sv("a", FALSE)));

    /** Treat $a as a string **/
    eval_pv("$a = 'relreP kcaH rehtonA tsuJ'; $a = reverse($a);", TRUE);
    printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));

    /** Shut down **/
    perl_destruct(my_perl);
    perl_free(my_perl);
    return 0;
}

编译:

gcc -Wall perl_eval.c -o perl_eval -g `perl -MExtUtils::Embed -e ccopts -e ldopts`
链接
vote up0vote down

获取$@,$<,$^X的方式稍有不同:

GV *gv;
gv = gv_fetchpv("@", TRUE, SVt_PV);
gv = gv_fetchpv("<", TRUE, SVt_PV);
if(gv){
    printf("$< is:\t%ld\n", SvIV(GvSV(gv)));
}

/*^X, CTRL-X*/
gv = gv_fetchpv("\030", 0, SVt_PV);
if(gv){
    printf("$^X = %s\n", SvPV(GvSV(gv), n_a));
}

关于gv_fetchpv(perl-5.14.1):

#define gv_fetchpv(a,b,c)   Perl_gv_fetchpv(aTHX_ a,b,c)

GV *
Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, const svtype sv_type) {
    PERL_ARGS_ASSERT_GV_FETCHPV;
    return gv_fetchpvn_flags(nambeg, strlen(nambeg), add, sv_type);
}

关于$^X

STATIC void
S_set_caret_X(pTHX) {
    dVAR;
    GV* tmpgv = gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL, SVt_PV); /* $^X */
    if (tmpgv) {
#ifdef HAS_PROCSELFEXE
    S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
#else
#ifdef OS2
    sv_setpv(GvSVn(tmpgv), os2_execname(aTHX));
#else
    sv_setpv(GvSVn(tmpgv),PL_origargv[0]);
#endif
#endif
    }
}

所以char *embedding[] = { "", "-e", "0" };的第一个元素只是提供一个选项,

$^X的最终取值在不同平台也会不同。

参考:

$^X

Getting Special Variable Values(部分信息已过时)

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.