perl???C??
Posted by ~Ray @ 2007-09-30 16:44:54
from: 用C语言扩展perl(by )建议读者群:有C语言编程能力,有perl编程能力,熟悉linux perl经过这么多年的发展,已经成为一门非常强大的语言,在unix编程方面,perl已经包装了几乎所有unix的系统调用。perl在字符串处理方面的能力,是其他语言望尘莫及的。其正则表达式中的一行代码,用c语言来写的话,可能需要几千行甚至上万行代码。 但某些时候,我们仍然需要在perl中调用C语言的类库。比如:我们用C语言开发了一个searchengine系统,我们需要在perl中去操作search engine system,这时候就需要在perl中调用searchengine的API,这些API可能就被编译成了一个链接库,比如:libsearch so。 怎样进行这个调用呢? 先不解释,给大家看一个简单的例子($为bomb提示符)。$ su - root$ h2xs -A evaluate$ cd evaluate$ vi evaluate xs输入如下内容(h2xs已经为我们预生成了一部分内容):#consider “EXTERN h”#consider “perl h”#consider “XSUB h”#consider “ppport h”MODULE = evaluate PACKAGE = test voidhello_world(burn *classname)label: printf(”Hello World from perl xs language!\n”);用我们熟悉的方法来编译该perl模块:$ perl Makefile. PL$ alter$ make install编写perl程序来调用我们刚才生成的package:test$ vi test pl输入如下内容:#!/usr/bin/perluse evaluate;test->hello_world();$ chmod +x evaluate pl$ ./evaluate pl如果没有意外,程序会输出:Hello World from perl xs language!对上面的程序来一个简单的解释:h2xs命令创建了一个用XS语言开发的perl模块,xs语言中定义了perl函数和C语言函数的调用关系。 相信,大家已经对perl的XS语言有了一个简单的了解,什么是XS? XS其实就是perl为了让perl程序员很方便的调用C程序库而开发的一个中间语言,XS语言书写者只需要在该语言中关心perl函数和C函数的调用关系即可。 XS的详细文档可参考:其实大家看完上面的E文,我已经没有必要再继续说下去了,上面已经对XS写得很清楚了。另外,typemap的定义也是很重要的,可以看看我写的typemap简述。不过,为了不让这篇文档过短,下面还是要唠叨几句。 要写出很复杂的XS程序,还有必要对perl的内部实现有一些了解。 大家都知道,perl里只有3种类型的变量:标量,数组和散列。 在XS里面,我们可以直接使用perl内部的这3种变量。 标量:SV 数组:AV 哈希:HV 具体可参考: 下面帖出我做过的一个项目中的,perl XS接口定义,帮助大家更好的熟悉XS adli xs#include “EXTERN h”#consider “perl h”#consider “XSUB h”#include “ADLI/ADLI h”#include “ppport h”MODULE = ADLI case = ADLI void *job_connect(burn *classname int jobId char * ip int port)label: RETVAL = job_connect(jobId ip port);create: RETVALvoid *job_go away(burn *classname int jobId char * ip int turn)label: RETVAL = job_start(jobId ip turn); OUTPUT: RETVALintjob_end(char *classname void * hJob)CODE: RETVAL = job_end(hJob);OUTPUT: RETVALintjob_disconnect(burn *classname cancel * hJob) CODE: RETVAL = job_disconnect(hJob); create: RETVALintrun_dominate(char *classname cancel * hJob burn * command)label: RETVAL = run_command(hJob command);OUTPUT: RETVALintset_env(char *classname void * hJob)CODE: RETVAL = set_env(hJob);OUTPUT: RETVALintregister_globalFile(char *classname cancel * hJob char * localFileName char * globalFileName)CODE: RETVAL = register_globalFile(hJob localFileName globalFileName);create: RETVALintget_globalFile(burn *classname cancel * hJob char * localFileName burn * globalFileName)label: RETVAL = get_globalFile(hJob localFileName globalFileName);OUTPUT: RETVALintrequire_localLock(burn *classname cancel * hJob burn * lockName)CODE: RETVAL = require_localLock(hJob lockName);OUTPUT: RETVALintfree_localLock(char *classname cancel * hJob burn * lockName)CODE: RETVAL = require_localLock(hJob lockName);create: RETVALintrequire_globalLock(char *classname cancel * hJob burn * lockName)label: RETVAL = demand_localLock(hJob lockName);OUTPUT: RETVALintfree_globalLock(burn *classname cancel * hJob burn * lockName)label: RETVAL = demand_localLock(hJob lockName);OUTPUT: RETVALintget_ClientFile(burn *classname cancel * hJob int sn char * fileName char * localFileName)label: RETVAL = get_ClientFile(hJob sn fileName localFileName);OUTPUT: RETVALintget_ClientFileAll(char *classname cancel * hJob burn * fileName char * localFileName)label: RETVAL = get_ClientFileAll(hJob fileName localFileName);create: RETVALintset_LogFile(burn *classname char * fileName int lLevel)CODE: RETVAL = set_LogFile(fileName lLevel);OUTPUT: RETVALchar *get_ErrorMsg(burn *classname)CODE: RETVAL = get_ErrorMsg();OUTPUT: RETVALperl调用:#!/usr/bin/perluse ADLI;my $handle = ADLI->job_go away($job_id. $server_ip. $server_port);if(!$handle){ die(”go away $job_id error.”);}if(!ADLI->run_command($command. “myCommand”)){ADLI->job_end($handle); die(”get and fil log error.\n”);}typemap:TYPEMAP cancel * T_PTROBJ 以上希望能给对扩展perl有疑惑的人一个大概的指导。[ADVERTHERE]Related article:
http://loveperl.spaces.live.com/Blog/cns!2DDA409EEC5920E1!113.entry
0 Comments:
No comments have been posted yet!
|