VC和Perl的互相调用收集
来源:互联网 发布:js 时间排序函数 编辑:程序博客网 时间:2024/05/17 02:48
作者: 来源: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脚本,做成笨蛋按钮式的,呵呵。。。
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"
3.
int_tmain(int argc, _TCHAR* argv[])
{
//
//
//
}
大体上就这些了。其它的用VS做界面框,各人需要自己去弄。(当然你得先安装了Perl)。
当然,这个仍是一个VC程序硬绑定一个perl脚本,若要实现程序界面(上面暂是控制台)和运行时刻选择perl脚本,嘿嘿,那就通过读一个配置文件以传递脚本名称吧。
参考页面:(在C 程序中嵌入 perl)
http://bbs.chinaunix.net/viewthread.php?tid=770248###
- VC和Perl的互相调用收集
- VC和Python的互相调用
- VC和Python的互相调用
- python和C/C++的互相调用 VC
- python和C/C++的互相调用 VC
- VC~CB 的DLL互相调用问题
- VC++和C++builder互相调用动态链接库DLL(VC++编的)笔记
- VC变量与matlab变量之间的转换,和互相调用
- 如何实现IE中JS和VC之间的互相调用
- 如何实现IE中JS和VC之间的互相调用
- VC 和 Halcon 之间的互相赋值
- VC 和 Halcon 之间的互相赋值
- VC 和 Halcon 之间的互相赋值
- perl, shell, tcl,c 互相调用
- vc++6.0中文档、视图与框架的互相调用
- vc 6.0中文档、视图与框架的互相调用
- vc++6.0中文档、视图与框架的互相调用
- C和lua的互相调用
- JAX-RPC学习笔记(2)-通过动态代理客户端访问webservice
- 数据结构(C语言版)规范代码之图(邻接表的拓扑排序)
- [HKEY_LOCAL_MACHINE\init]键值的含义
- proc文件系统解析
- 面试,杯具了也可以从中找到不足
- VC和Perl的互相调用收集
- POJ 1573 Robot Motion模拟
- 数据结构(C语言版)规范代码之图(邻接多重表遍历)
- 2B
- 35岁的程序员,何去何从?
- JavaScript学习思索
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- 数据库还原
- C语言测试题