现在的位置: 首页 > 综合 > 正文

在C 程序中嵌入Perl

2019年05月14日 ⁄ 综合 ⁄ 共 2481字 ⁄ 字号 评论关闭
文章目录

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

抱歉!评论已关闭.