当需要在 C 中使用 Perl 时,程序一般要分配,运行,释放一个 perl 解释器对象。
perl 库一般在这样的文件夹下:
/usr/local/lib/perl5/your_architecture_here/CORE |
可以这样得到它的位置:
perl -MConfig -e "print $Config{archlib}" |
编译的时候要这样:
% gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include -I/usr/local/lib/perl5/i586-linux/5.003/CORE -L/usr/local/lib/perl5/i586-linux/5.003/CORE -o interp interp.c -lperl -lm |
要选择合适的编译器,这个会告诉你用什么编译器:
perl -MConfig -e "print $Config{cc}" |
你还要选好库文件夹。编译器说找不到某某函数,可能要通过 "-L" 选定目录。如果它说找不到 "EXTERN.h" 和 "perl.h",你可能需要通过 "-I" 改变路径。
一些其它的库也需要加入,可以通过这样得到:
perl -MConfig -e "print $Config{libs}" |
可以通过这样编译:
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
在 C 程序中加入 Perl 解析器
perl( C 程序 ) 就是一个嵌入 Perl( 语言 ) 的很好的例子。这是一个简单的例子。
#include <EXTERN.h> /* from the Perl distribution */ #include <perl.h> /* from the Perl distribution */ static PerlInterpreter *my_perl ; /*** The Perl interpreter ** */ int main (int argc , char **argv , char **env ) { PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, NULL , argc, argv, (char **)NULL ); perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); }
注意到 env 参数没有用到。
PERL_SYS_INIT3() 和 PERL_SYS_TERM() 提供一个运行环境。
从 C 程序中调用 perl 函数
/* showtime.c */ #include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl ; int main (int argc , char **argv , char **env ) { char *args [] = { NULL }; PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl, NULL , argc, argv, NULL ); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; /*** skipping perl_run() ** */ call_argv("showtime" , G_DISCARD | G_NOARGS, args); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); }
showtime 是一个没有参数也没有返回值(G_NOARGS, G_DISCARD)的 perl 函数。
# ! /usr/bin/perl -w # showtime.pl print "I shan't be printed." ; sub showtime { print time ; }
在这个例子中,我们没有调用 perl_run。
在 C 程序中求值
#include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl ; main (int argc , char **argv , char **env ) { STRLEN n_a ; char *embedding [] = { "" , "-e" , "0" }; PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL , 3, embedding, NULL ); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_run(my_perl); /** Treat $a as an integer * */ eval_pv("$a = 3; $a **= 2" , TRUE); printf("a = %d/n" , 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 = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);" , TRUE); printf("a = %s/n" , SvPV(get_sv("a" , FALSE), n_a)); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); }
结果输出:
a = 9 a = 9.859600 a = Just Another Perl Hacker 转自 http://www.yuanma.org/data/2006/1010/article_1636.htm