VC和Perl的互相调用收集

来源:互联网 发布:js 时间排序函数 编辑:程序博客网 时间:2024/05/17 02:48
VC中调用PERL子程序
作者: 来源:zz 发表时间:2007-02-09 浏览次数: 2691 字号:大 中 小

因需要,要在VC中调用PERL子程序对文件进行处理。通过看PERL说明文档折腾了好长时间,可以运行。现与大家分享,呵呵,希望对大家有所帮助^ -^
1在工程文件中加入 perl58.dll

2. 在VC中加入头文件
#include <EXTERN.h>
#include <perl.h>

3.
void perl_sub(char*a)
{
int retval;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpv(a, 0)));
PUTBACK;
retval=call_pv("readfile",G_ARRAY);
SPAGAIN;
for (int i = 1; i <= retval;++i)

{ int t=POPl;
printf ("Value %d = %d\n", i, t);
}
PUTBACK;


FREETMPS;
LEAVE;


}

int main(int argc, char **argv, char **env)
{
char *args[] = { " ","sub.pl" };
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);

perl_parse(my_perl, NULL, argc, args,(char**)NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_sub("test.txt");
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
int i;
scanf("%d",&i);
}/////////////////////////////////////////////调用PERL结束

注:sub.pl的内容

sub readfile
{

my($s) = @_;
#my($s) ="test.txt";
open(FH,$s)||die "can't open FH;$!"; #读取文本文件
my @readstr=<FH>;
#print @readstr;

$filename="22.bin";
open(IN,">:raw",$filename) or die "cannot open $filename !\n"; #open(IN,">>:raw",$filename)是追加写
seek(IN,0,SEEK_SET);
foreach my $one (@readstr) #对每行进行处理
{
#chop($one);
my @words3=split(/\s+/,$one);


if ($words3[12] eq "绿灯")
{$words3[12]=0;}
if ($words3[12] eq "绿黄灯")
{$words3[12]=1;}
#print "\n";

#print @words3;



print IN pack("n16",@words3);

}

#close(IN) or die "cannot close\n";
}

附加:
1.VC中嵌入PERL片段
#include "stdafx.h"
#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);
// eval_pv(" $a = 3; $a **= 2", TRUE);
eval_pv(" $a = 3; $a **= 2", TRUE);
printf("a = %d\n", SvIV(get_sv("a", FALSE)));
eval_pv("$a = 3.14; $a **= 2", TRUE);
printf("a = %f\n", SvNV(get_sv("a", FALSE)));
eval_pv(" {$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);}", TRUE);
printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));

eval_pv("print 'Please enter first number:';$number1 = <STDIN>;chomp $number1;$number2 = <STDIN>;chomp $number2;$sum = $number1 + $number2;", TRUE);
printf("sum = %f\n", SvNV(get_sv("sum", FALSE)));
eval_pv("print 'hello'", TRUE);
// eval_pv("my $today = new Date;$today->setDate( 7, 14, 2000 );print( $today->month() );print( '\n' );$today->print();print( '\n' );", TRUE);



//eval_pv("use strict; $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();
int i;
scanf("%d",&i);


}
2.在PERL中嵌入C
use Inline C;
{
# $a=5;
#$b=19;
@c=(9,19);
print "begin\n";
print "9 + 19 = ", add(@c,"STRING"), "\n";
print "9 - 16 = ", subtract(9, 16), "\n";
print "end\n";
}
__END__
__C__
int add(int a,int b,char* z) {
int words[2]={0,0};
words[0]=a;
words[1]=b;


printf("%s",z);
return words[0]+words[1];

}
int subtract(int x, int y) {
return x - y;

}


今日,改写一些perl生成顺序递增数的代码。为满足测试,需要不断运行以生成新的一百万个随机数。由于起始数不同,每次都需要在代码里的修改再运行(或敲命令的传递)。若只是我使用,也不会觉得太麻烦。但,队友使用起来就不太方便。还是用VC做个界面,在C/C++代码里调用perl脚本,做成笨蛋按钮式的,呵呵。。。

 

   说真的,还真不知如何用C/C++调用perl呢?(当然这里的C/C++,俺是说用VS环境里的)。

 

   网上搜索一下,CSDN里花3个积分下了一份简便的说明文档(作者是谁忘了,别怪我)。操作步骤如下:

1.VS里的工程设置:

工具->选项->项目和解决方案->VC++目录,在“显示以下内容的目录(S):”下拉框中选择“包括文件”, 添加*\bin, *\lib\core,*表示perl的安装路径。

 

工具->选项->项目和解决方案->VC++目录,在“显示以下内容的目录(S):”下拉框中选择“库文件”,添加*\lib\core, *表示perl的安装路径。

 

把perl58.lib加入到工程中,项目->“项目”属性->配置属性->链接器->命令行,在附加选项里加上perl56.lib(因为俺用的perl版本是5.6的)

2.在项目的代码里添加头文件

#include"EXTERN.h"    //引用外部的头文件
#include"perl.h"      //perl头文件

3. 项目程序代码

int_tmain(int argc, _TCHAR* argv[])
{
// char *embedding[] ={"","C:\\data.pl","E:\\dumptobin"};//perl脚本和参数,第一个为空,没有空格,
                                                       //第二个为脚本文件,第三个为脚本的输入参数
    char*embedding[] = {"","C:\\perl2\\CreateNumber.pl",""};//俺的perl脚本的真实路径,没有输入参数

 static PerlInterpreter*my_perl;//定义一个perl解释器

 my_perl =perl_alloc();//为解释器分配资源

 perl_construct( my_perl);//创建一个解释器

 perl_parse(my_perl, NULL, 3, embedding,NULL);//perl解析
   //perl_parse函数原型是:
   //PERL_CALLCONV intperl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc,char** argv, char** env)

 perl_run(my_perl);//运行

// int str =SvIV(perl_get_sv("lastValue",FALSE));//把perl脚本中的变量lastValue传给C中的变量str,无效的语句
// printf("返回值为%d.\n", str);

   perl_destruct(my_perl);//析构解释器

 perl_free(my_perl);//释放解释器

 return 0;
}

大体上就这些了。其它的用VS做界面框,各人需要自己去弄。(当然你得先安装了Perl)。

当然,这个仍是一个VC程序硬绑定一个perl脚本,若要实现程序界面(上面暂是控制台)和运行时刻选择perl脚本,嘿嘿,那就通过读一个配置文件以传递脚本名称吧。

 

 

参考页面:(在C 程序中嵌入 perl)

http://bbs.chinaunix.net/viewthread.php?tid=770248###