当前位置: 首页 >> 程序设计 >> 在C 程序中嵌入Perl
 

在C 程序中嵌入Perl

作者:火鸡的笔记本      来源:http://blog.chinaunix.net     发表时间:2006-10-10     浏览次数:      字号:    

当需要在 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

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •