• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            高性能服務器開發;C++深探

            c中調用perl的測試小程序,各種場景繼續測試中

            tar包位置:http://www.shnenglu.com/Files/changup/c_perl.tar

            本次測試比較完整的一個c文件,貼出來,請高人指點完善,爭取大家實際中能用好,畢竟感覺在程序中嵌入解釋性的腳本是非常好的,尤其針對復雜多變的業務邏輯部分;

             

            #include <stdio.h>
            #include 
            <string.h>
            #include 
            <stdlib.h>
            #include 
            <EXTERN.h>
            #include 
            <perl.h>

            static PerlInterpreter* my_perl;

            #define CALLFUN_BEGIN  dSP; \
                      ENTER; \
                      SAVETMPS; \
                      PUSHMARK(SP);
            #define CALLFUN_END  FREETMPS;\
                      LEAVE;
                       


            void initperlenv(int argc, char* argv[])
            {
                my_perl 
            = perl_alloc();
                perl_construct(my_perl);    
                perl_parse(my_perl, NULL, argc, argv, (
            char **)NULL);
            }

            void destroyperlenv()
            {
                  perl_destruct(my_perl);
                  perl_free(my_perl);    
            }

            /* 普通perl標量的操作
            */
            void SV_test()
            {
                
            //創建
                SV* sv_i = newSViv(99);
                SV
            * sv_n = newSVnv(23.45);
                SV
            * sv_p = newSVpv("test string",0);
                
                SV
            * funstring = 0;
                
                
            //將變量設置為mortal;
                sv_2mortal(sv_i);
                sv_2mortal(sv_n);
                sv_2mortal(sv_p);    
                
                
            //探測類型
                if(SvIOK(sv_i))
                {
                    printf(
            "sv_i is a int type,value=%d\n"*(int*)(sv_i->sv_any));
                }
                
            else
                {
                    printf(
            "sv_i is not a int type\n");
                }
                
            if(SvNOK(sv_n))
                {
                    printf(
            "sv_n is a double type\n");
                }
                
            else
                {
                    printf(
            "sv_n is not a double type\n");
                }
                
            if(SvPOK(sv_p))
                {
                    printf(
            "sv_p is a string type\n");
                }
                
            else
                {
                    printf(
            "sv_p is not a string type\n");
                }
                
                
            //探測類型,這次打印出的是類型的宏定義
                printf("sv_i.type=%u\n", SvTYPE(sv_i));
                printf(
            "sv_n.type=%u\n", SvTYPE(sv_n));
                printf(
            "sv_p.type=%u\n", SvTYPE(sv_p));
                
                
            //以優美的格式打印標量
                sv_dump(sv_i);
                sv_dump(sv_n);
                sv_dump(sv_p);
                
                
            //修改值
                sv_setiv(sv_i,89);
                sv_dump(sv_i);
                sv_setnv(sv_n,
            89.76);
                sv_dump(sv_n);
                sv_setpv(sv_p,
            "String changed");
                sv_dump(sv_p);
                
                
            //操作pl腳本中的文件
                funstring = perl_get_sv("main::getstring",1); //沒有得到值
                sv_dump(funstring);
            }

            /* 操作perl函數
            sub fun1()
            {
                $username = shift;
                $arg = shift;
                print "your name=$username,your arg=$arg\n";
                return 88;
            }
            */
            int call_fun()
            {
                
            //調用函數前的perl堆棧操作
                CALLFUN_BEGIN;
                
                
            //參數入棧
                XPUSHs(sv_2mortal(newSVpv("changym",0)));
                XPUSHs(sv_2mortal(newSViv(
            32)));
                PUTBACK; 
            //表示參數完了
                
                
            //調用函數
                perl_call_pv("fun1",G_SCALAR); //G_SCALAR---返回標量;G_ARRAY--返回數組
                /*
                #define G_SCALAR        0
                #define G_ARRAY         1
                #define G_VOID          128     /* skip this bit when adding flags below 
            */
                
                
            //extra flags for Perl_call_* routines
                
            //#define G_DISCARD       2       /* Call FREETMPS. */
                
            //#define G_EVAL          4       /* Assume eval {} around subroutine call. */
                
            //#define G_NOARGS        8       /* Don't construct a @_ array. */
                
            //#define G_KEEPERR      16       /* Append errors to $@, don't overwrite it */
                
            //#define G_NODEBUG      32       /* Disable debugging at toplevel.  */
                
            //#define G_METHOD       64       /* Calling method. */
                
                
            //開始操作返回值了
                SPAGAIN;
                printf(
            "inner ibm.pl,fun1 return %s\n",POPp); //POPi---int, POPp--pchar
                PUTBACK; //表示返回值取完了
                
                
            //perl棧資源回收
                CALLFUN_END;
                
            return 0;
            }

            /* 操作perl函數,perl 函數返回一個數組
            sub return_array()
            {
                @arr = ("changym","chenjx","changjr","xiaobaobao");
                print "inner ibm.pl.return_array:@arr\n";
            }
            */
            int call_fun_ret_array()
            {
                
            int ireturn = 0;
                STRLEN n_a; 
            //詭異的現象,非要定義這個否則打印值的哪行就報錯
                            
            //ibm.c:162: `n_a' undeclared (first use in this function)
                            
            //同樣的問題就是PerlInterpreter的名字必須叫my_perl,為什么啊?
                
            //調用函數前的perl堆棧操作
                CALLFUN_BEGIN;    
                PUTBACK; 
            //表示參數完了
                
                
            //調用函數
                ireturn = perl_call_pv("return_array",G_ARRAY); //G_SCALAR---返回標量;G_ARRAY--返回數組
                
            //開始操作返回值了
                SPAGAIN;
                
            if(ireturn>0)
                {
                    
            while(ireturn>0)
                    {
                        
            //返回的順序是數組的倒敘啊?
                        printf("coming from ibm.pl.return_array:%d-%s\n",ireturn--,POPpx);
                    }
                }
                
                PUTBACK; 
            //表示返回值取完了    
                
            //perl棧資源回收
                CALLFUN_END;
                
            return 0;
            }


            int main(int argc, char* argv[])
            {
                
            char* my_argv[] = {"","ibm.pl"};
                printf(
            "begin c_perl_ibm_test\n");
                printf(
            "init perl env\n");
                
                initperlenv(
            2,my_argv);
                
                
            //標量操作測試
                
            //SV_test();
                
                
            //函數操作測試
                
            //call_fun();
                
                
            //操作perl函數返回數組測試
                call_fun_ret_array();    
                
                destroyperlenv();    
                printf(
            "leaved c_perl_ibm_test\n");
                
            return 0;
            }

             

            posted on 2010-12-30 18:14 changup 閱讀(2184) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式實踐隨想

            99久久国产亚洲综合精品| 久久国产精品77777| 四虎国产精品成人免费久久| 伊人 久久 精品| 国产69精品久久久久777| 国产亚州精品女人久久久久久| 亚洲国产精品成人AV无码久久综合影院| 日韩欧美亚洲综合久久影院Ds | 亚洲人成网亚洲欧洲无码久久| 久久精品国产日本波多野结衣| 亚洲国产精品久久久久网站 | 狠狠精品干练久久久无码中文字幕 | 欧美久久亚洲精品| 国产精品久久久久国产A级| 久久久久国产视频电影| 久久久久亚洲Av无码专| 国产精品美女久久福利网站| 日韩亚洲欧美久久久www综合网| 7777精品伊人久久久大香线蕉 | 久久久人妻精品无码一区| 国产亚洲欧美成人久久片| 蜜桃麻豆WWW久久囤产精品| 国产女人aaa级久久久级| 69国产成人综合久久精品| 日韩乱码人妻无码中文字幕久久| 久久香蕉国产线看观看猫咪?v| 26uuu久久五月天| 99久久精品影院老鸭窝| 国产亚洲精品自在久久| 色偷偷88888欧美精品久久久| 亚洲成av人片不卡无码久久| 久久久久亚洲爆乳少妇无| 精品久久久久国产免费| 色综合久久中文综合网| 日本精品久久久中文字幕| 久久伊人精品青青草原高清| 久久精品国产亚洲一区二区| 久久99久久99小草精品免视看| 高清免费久久午夜精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久精品国内一区二区三区|