#include #include static PerlInterpreter *my_perl = NULL ; void load_perl(){ char *embedding[] = { "", "-e", "0" }; if (my_perl == NULL){ my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL, 3, embedding, NULL); perl_run(my_perl); } } char *eval_perl(char *user_code, char **error){ char *code = (char *)calloc(strlen(user_code) + 512, sizeof(char)) ; SV *ret = NULL ; SV *err = NULL ; strcat(code, user_code) ; ret = eval_pv(user_code, FALSE) ; free(code) ; err = get_sv("@", TRUE) ; if (SvTRUE(err)){ *error = SvPV_nolen(err) ; return NULL ; } return SvPV_nolen(ret) ; } void unload_perl(){ if (my_perl != NULL){ perl_destruct(my_perl); perl_free(my_perl); my_perl = NULL ; } } main (int argc, char **argv){ char code[1024] ; char *error = NULL ; char *ret = NULL ; sprintf(code, "%s", "die('!!') ;") ; load_perl() ; ret = eval_perl(code, &error) ; if (error != NULL){ printf("ERROR: %s\n", error) ; } else{ printf("SUCCESS: %s\n", ret) ; } unload_perl() ; }