Perl中内嵌C代码
By:云舒
2007-12-21
Blog: http://www.icylife.net
这个又是一篇好玩的文章,前几天回家看爸爸妈妈,在火车上闲得没事,翻看perl的文档,练练英语,也仔细读读perl的一些东西。插一句老话,不是语言不行,而是人不行,努力去学,所有的语言都有适合的领域,都有生存的空间。
以前有些应用中perl的速度比较慢,但是如果和c结合起来,就可以解决这样的问题了。perl和c结合有三种办法,第一是用c来写xs制作perl模块,再在perl代码中加载,这个比较简单,CU和IBM都有文档看,我就不写了。第二是在C中嵌入perl脚本,这个对我来说没什么用,我还没看。第三就是本文要说的,在Perl中嵌入C代码了。实现起来简单方便,唯一的要求是运行perl脚本的机器要有编译器,VC和GCC都行。直接看代码吧,然后再解释:
代码:
#!/usr/bin/perl
use warnings;
use strict;
use Inline C => <<'END_C';
#include <windows.h>
SV *MakeSV( char *name )
{
return newSVpvf( "I'm %s", name );
}
HV *MakeHash( char *key_name, char *value )
{
HV *my_hash = newHV( );
hv_store( my_hash, key_name, strlen(key_name), newSVpv( value, strlen(value) ), 0 );
return my_hash;
}
void AddKey( HV *my_hash, char *key_name, char *value )
{
hv_store( my_hash, key_name, strlen(key_name), newSVpv( value, strlen(value) ), 0 );
}
void MyBox( char *title, char *content )
{
MessageBox( NULL, content, title, MB_OKCANCEL );
}
END_C
print MakeSV( "yunshu\n" );
my %hash = %{ MakeHash( "first", "yunshu" ) };
$hash = "icy";
AddKey( \%hash, "third", "nmap" );
AddKey( \%hash, "end", "luoluo" );
foreach my $key( keys(%hash) )
{
print "$key\t->\t".$hash."\n";
}
MyBox( "test", "hello world" );
首先是use Inline C => <<'END_C';引入模块表示要嵌入C语言代码,并且指名END_C表示C代码结束。这里的C代码中,MakeSV函数我演示了如何将C 中的字符串返回给Perl成为标量;MakeHash函数,我演示了如何创建一个哈希表(HashTable),并保存了一个key和它的value,然后将这个哈希表返回给Perl使用;AddKey函数,我演示了如何在Perl中使用C中返回的哈希表,并用C代码添加一个元素;MyBox函数,我演示了如何调用windows的API函数。代码很简单,看看就明白了。
需要注意的是,当C代码中需要指针的时候,你必须在Perl中传递一个应用给C函数;当C中返回一个指针的时候,你需要使用%{ }将C中返回的HashTable指针(引用)转换成HashTable,转换数组则使用@{ }来进行。这里C代码中的一些函数,都是Perl提供的C API接口,详细的资料可以参考:http://perldoc.perl.org/perlguts.html,你安装perl的目录下面有离线版本。有什么意见,可以给我发mail。