您的位置:首页 > 其它

在VC中调用PERL子程序

2007-02-07 16:21 344 查看
因需要,要在VC中调用PERL子程序对文件进行处理。通过看PERL说明文档折腾了好长时间,可以运行。现与大家分享,呵呵,希望对大家有所帮助^ -^
1在工程文件中加入 perl58.dll
[align=left] [/align]
[align=left]2. 在VC中加入头文件[/align]
[align=left] #include <EXTERN.h>[/align]
#include <perl.h>

3.
[align=left] void perl_sub(char*a)[/align]
[align=left] {[/align]
[align=left] int retval;[/align]
[align=left] dSP; [/align]
[align=left] ENTER;[/align]
[align=left] SAVETMPS; [/align]
[align=left] PUSHMARK(SP);[/align]
[align=left] XPUSHs(sv_2mortal(newSVpv(a, 0)));[/align]
[align=left] PUTBACK; [/align]
[align=left]retval=call_pv("readfile",G_ARRAY);[/align]
[align=left] SPAGAIN;[/align]
[align=left] for (int i = 1; i <= retval;++i)[/align]
[align=left] [/align]
[align=left] { int t=POPl;[/align]
[align=left] printf ("Value %d = %d/n", i, t);[/align]
[align=left] }[/align]
[align=left] PUTBACK; [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] FREETMPS;[/align]
[align=left] LEAVE;[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] int main(int argc, char **argv, char **env)[/align]
[align=left] {[/align]
[align=left] char *args[] = { " ","sub.pl" };[/align]
[align=left] PERL_SYS_INIT3(&argc,&argv,&env);[/align]
[align=left] my_perl = perl_alloc();[/align]
[align=left] perl_construct(my_perl);[/align]
[align=left] [/align]
[align=left] perl_parse(my_perl, NULL, argc, args,(char**)NULL);[/align]
[align=left] PL_exit_flags |= PERL_EXIT_DESTRUCT_END;[/align]
[align=left]perl_sub("test.txt");[/align]
[align=left] perl_destruct(my_perl);[/align]
[align=left] perl_free(my_perl);[/align]
[align=left] PERL_SYS_TERM();[/align]
[align=left] int i;[/align]
[align=left] scanf("%d",&i);[/align]
[align=left] }/////////////////////////////////////////////调用PERL结束 [/align]

注: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片段
[align=left]#include "stdafx.h"[/align]
[align=left]#include <EXTERN.h>[/align]
[align=left]#include <perl.h> [/align]
[align=left]static PerlInterpreter *my_perl; [/align]
[align=left]main (int argc, char **argv, char **env)[/align]
[align=left] {[/align]
[align=left] STRLEN n_a;[/align]
[align=left] char *embedding[] = { "", "-e", "0" }; [/align]
[align=left] PERL_SYS_INIT3(&argc,&argv,&env);[/align]
[align=left] my_perl = perl_alloc();[/align]
[align=left] [/align]
[align=left] perl_construct( my_perl ); [/align]
[align=left] perl_parse(my_perl, NULL, 3, embedding, NULL);[/align]
[align=left] PL_exit_flags |= PERL_EXIT_DESTRUCT_END;[/align]
[align=left] perl_run(my_perl); [/align]
[align=left] // eval_pv(" $a = 3; $a **= 2", TRUE);[/align]
[align=left] eval_pv(" $a = 3; $a **= 2", TRUE);[/align]
[align=left] printf("a = %d/n", SvIV(get_sv("a", FALSE))); [/align]
[align=left] eval_pv("$a = 3.14; $a **= 2", TRUE);[/align]
[align=left] printf("a = %f/n", SvNV(get_sv("a", FALSE))); [/align]
[align=left] eval_pv(" {$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);}", TRUE);[/align]
[align=left] printf("a = %s/n", SvPV(get_sv("a", FALSE), n_a)); [/align]
[align=left] [/align]
[align=left] eval_pv("print 'Please enter first number:';$number1 = <STDIN>;chomp $number1;$number2 = <STDIN>;chomp $number2;$sum = $number1 + $number2;", TRUE);[/align]
[align=left] printf("sum = %f/n", SvNV(get_sv("sum", FALSE))); [/align]
[align=left] eval_pv("print 'hello'", TRUE);[/align]
[align=left] // eval_pv("my $today = new Date;$today->setDate( 7, 14, 2000 );print( $today->month() );print( '/n' );$today->print();print( '/n' );", TRUE);[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] //eval_pv("use strict; $a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);[/align]
[align=left] //printf("a = %s/n", SvPV(get_sv("a", FALSE), n_a)); [/align]
[align=left] [/align]
[align=left] perl_destruct(my_perl);[/align]
[align=left] perl_free(my_perl);[/align]
[align=left] PERL_SYS_TERM();[/align]
[align=left] int i;[/align]
[align=left] scanf("%d",&i);[/align]
[align=left] [/align]
[align=left] [/align]
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: