了几乎所有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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)