Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1132983
  • 博文数量: 221
  • 博客积分: 10152
  • 博客等级: 上将
  • 技术积分: 1518
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-22 10:42
文章分类

全部博文(221)

文章存档

2018年(1)

2015年(6)

2014年(3)

2013年(4)

2012年(1)

2011年(5)

2010年(14)

2009年(10)

2008年(28)

2007年(33)

2006年(114)

2005年(2)

我的朋友

分类: C/C++

2006-10-09 10:00:45

当需要在 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             /* 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() 提供一个运行环境。

从 C 程序中调用 perl 函数

/* 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。

在 C 程序中求值

#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
阅读(2778) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~