分类: C/C++
2006-10-09 10:00:45
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`
#include/* from the Perl distribution */
#include/* 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() 提供一个运行环境。
/* showtime.c */
#include
#include
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。
#include
#include
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