用C语言扩展perl

用C语言扩展perl,第1张

概述 perl经过这么多年的发展,已经成为一门非常强大的语言,在unix编程方面,perl已经包装 了几乎所有unix的系统调用。perl在字符串处理方面的能力,是其他语言望尘莫及的。其正则 表达式中的一行代码,用c语言来写的话,可能需要几千行甚至上万行代码。     但某些时候,我们仍然需要在perl中调用C语言的类库。比如:我们用C语言开发了一个search engine系统,我们需要在perl中  perl经过这么多年的发展,已经成为一门非常强大的语言,在unix编程方面,perl已经包装
了几乎所有unix的系统调用。perl在字符串处理方面的能力,是其他语言望尘莫及的。其正则
表达式中的一行代码,用c语言来写的话,可能需要几千行甚至上万行代码。
    但某些时候,我们仍然需要在perl中调用C语言的类库。比如:我们用C语言开发了一个search
engine系统,我们需要在perl中去 *** 作search engine system,这时候就需要在perl中调用search
engine的API,这些API可能就被编译成了一个链接库,比如:libsearch.so。
    怎样进行这个调用呢?
    先不解释,给大家看一个简单的例子($为shell提示符)。
$ su - root
$ h2xs -A test
$ cd test
$ vi test.xs
输入如下内容(h2xs已经为我们预生成了一部分内容):
#include “EXTERN.h”
#include “perl.h”
#include “XSUB.h”
#include “ppport.h”

MODulE = test  PACKAGE = test  
voID
hello_world(char *classname)
CODE:
  printf(”Hello World from perl xs language!\n”);
用我们熟悉的方法来编译该perl模块:
$ perl Makefile.PL
$ make
$ make install
编写perl程序来调用我们刚才生成的package:test
$ vi test.pl
输入如下内容:
#!/usr/bin/perl
use test;
test->hello_world();
$ chmod +x test.pl
$ ./test.pl
如果没有意外,程序会输出:Hello World from perl xs language!
对上面的程序来一个简单的解释:h2xs命令创建了一个用XS语言开发的perl模块,xs语言中定义了perl函数和C语言函数的
调用关系。
     相信,大家已经对perl的XS语言有了一个简单的了解,什么是XS?
     XS其实就是perl为了让perl程序员很方便的调用C程序库而开发的一个中间语言,XS语言书写者只需要在该语言中关心
perl函数和C函数的调用关系即可。
     XS的详细文档可参考: http://perldoc.perl.org/perlxs.html
其实大家看完上面的E文,我已经没有必要再继续说下去了,上面已经对XS写得很清楚了。
另外,typemap的定义也是很重要的,可以看看我写的typemap简述。
不过,为了不让这篇文档过短,下面还是要唠叨几句。
    要写出很复杂的XS程序,还有必要对perl的内部实现有一些了解。
    大家都知道,perl里只有3种类型的变量:标量,数组和散列。
    在XS里面,我们可以直接使用perl内部的这3种变量。
    标量:SV
    数组:AV
    哈希:HV
    具体可参考: http://perldoc.perl.org/perlguts.html
   
    下面帖出我做过的一个项目中的,perl XS接口定义,帮助大家更好的熟悉XS.
adli.xs
#include “ADli/ADli.h”
MODulE = ADli  PACKAGE = ADli  
voID *
job_connect(char *classname,int jobID,char * ip,int port)
  RETVAL = job_connect(jobID,ip,port);
OUTPUT:
  RETVAL
job_start(char *classname,250)">                RETVAL = job_start(jobID,250)">        OUTPUT:
                RETVAL
int
job_end(char *classname,voID * hJob)
  RETVAL = job_end(hJob);
job_disconnect(char *classname,250)">        CODE:
                RETVAL = job_disconnect(hJob);
run_command(char *classname,voID * hJob,char * command)
  RETVAL = run_command(hJob,command);
set_env(char *classname,250)">  RETVAL = set_env(hJob);
register_globalfile(char *classname,char * localfilename,char * globalfilename)
  RETVAL = register_globalfile(hJob,localfilename,globalfilename);
get_globalfile(char *classname,250)">  RETVAL = get_globalfile(hJob,250)">require_localLock(char *classname,char * lockname)
  RETVAL = require_localLock(hJob,lockname);
free_localLock(char *classname,250)">require_globalLock(char *classname,250)">free_globalLock(char *classname,250)">get_ClIEntfile(char *classname,int sn,char * filename,char * localfilename)
  RETVAL = get_ClIEntfile(hJob,sn,filename,localfilename);
get_ClIEntfileAll(char *classname,250)">  RETVAL = get_ClIEntfileAll(hJob,250)">set_Logfile(char *classname,int lLevel)
  RETVAL = set_Logfile(filename,lLevel);
char *
get_ErrorMsg(char *classname)
  RETVAL = get_ErrorMsg();
perl调用:
use ADli;
my $handle = ADli->job_start($job_ID,$server_ip,$server_port);
if(!$handle)
{
    dIE(”Start $job_ID error.”);
}
if(!ADli->run_command($handle,“myCommand”))
ADli->job_end($handle);
    dIE(”get and fil log error.\n”);
typemap:
TYPEMAP
     voID * T_PTROBJ

   以上希望能给对扩展perl有疑惑的人一个大概的指导。转载,出处:http://www.chinaunix.net/old_jh/25/951221.HTML

总结

以上是内存溢出为你收集整理的用C语言扩展perl全部内容,希望文章能够帮你解决用C语言扩展perl所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存