网站首页 | 站长论坛 | 免费空间申请 | 站长下载 | 站长博客 | 商业主机 | 免费空间推荐站点 | 免费空间排行榜 | 我们知道
发新话题
打印

[其它] [10-20] VC中调用PERL子程序

[10-20] VC中调用PERL子程序

因需要,要在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";
}

附加:
1VC嵌入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;
    }

TOP

看不懂是些什么东西

TOP

不错
老毛提供的广告:
老毛BLOG
有能力不能自傲,没能力不能放弃。  
www.laomao.net.ru

TOP

发新话题