转:perl-项目总结

一个小项目,用perl完成。环境windows,要求能够通过访问网页来启动网页所在服务器上的程序。
安装了apache_2.2.4-win32-x86-no_ssl,ActivePerl-5.8.8.822-MSWin32-x86-280952。
由于是第一次使用perl,而且是windows下的,一边学一边用,花了2个晚上搞定。
几个关键点:
1.用perl写cgi
i.在windows下也别漏掉
        #!C:/Perl/bin/perl.exe
ii.得到访问者的地址
     $IP = $ENV{'REMOTE_ADDR'}
iii.cookie操作
      use CGI qw/:standard/;
      use CGI::Cookie;
     

      设置cookie

      $cookie1 = new CGI::Cookie(-name=>'logined',-value=>true,-expires=>'+15m');
      print header(-cookie=>[$cookie1]);
      这里的expires有多种取值方式:

+30s                              30 seconds from now

   +10m                              ten minutes from now

   +1h                               one hour from now

   -1d                               yesterday (i.e. "ASAP!")

   now                               immediately

   +3M                               in three months

   +10y                              in ten years time

   Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date



         取cookie
               %cookies = fetch CGI::Cookie;
               if(defined($cookies{'logined'}))
               {
                  $logined = $cookies{'logined'}->value;
   }
   iv.读取get传进来的参数
      read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
      @pairs = split(/&/, $buffer);
      foreach (@pairs)
      {
   ($name, $value) = split(/=/, $_);
   $hashlist{$name}=$value;
      }
      if(defined($hashlist{"id"}) && defined($hashlist{"type"}))
      {
          $id = $hashlist{"id"};
          $type = $hashlist{"type"};
      }
2.socket编程
   svr:
      use Socket; #导入Socket库
      $localhost=sockaddr_in(4000,INADDR_ANY);#压入sockaddr_in模式,使用了INADDR_ANY保留字
      socket(SERVER,AF_INET,SOCK_DGRAM,17); #建立UDP套接字
   bind(SERVER,$localhost); #绑定套接字
       while(1)
       {   #进入服务器循环体
      next unless $client=recv(SERVER,$buff,100,0); #接收到数据压入$buff,保留远程地址在$client
            .....
       }
      close SERVER; #关闭套接字
       exit 1; #退出程序
  
    client:
       use Socket; #导入Socket库
       $packhost=inet_aton("127.0.0.1"); #压缩主机地址
       $address=sockaddr_in("5000",$packhost); #压为sockaddr_in模式
       socket(CLIENT,AF_INET,SOCK_DGRAM,17); #建立UDP套接字
       send(CLIENT,$sendData,0,$address); #向套接字发送字符串变量
   close CLIENT; #关闭套接字

3.windows下用perl来做进程的启动与关闭
不能使用fork,因为windows下的fork得到的pid是不准的,这是windows下perl的一个bug,不能用来杀掉进程。
正确方法是使用win32的库
use Win32::Process;
use Win32;
$progamName="C://WINDOWS//system32//calc.exe";#程序名
$progamName1=$progamName;
$progamName1.=" ";
$progamName1.=$param;#命令行参数

Win32::Process::Create($ProcessObj,
                            $progamName,
                            #"c://1.bat",
                            #"c://1.bat 1 2 3",
                            $progamName1,
                            0,
                            NORMAL_PRIORITY_CLASS,
                            ".")|| die "erro occur when create process";
     $pid = $ProcessObj->GetProcessID();
     Win32::Process::KillProcess($pid, 1);#kill掉进程

perl的一些基本语法:
1.类似python的split
    my @commd = split/:/,$buff;
      print $commd[0],$commd[1];
2.文件操作
     追加写入
     open(MYFILE,">>test") || die "can not open conference.conf:$!/n"; #全新写入是">test"
     print MYFILE "this is a test","/n";
     close(MYFILE);
    

    
open(MYFILE,"test") || die "can not open conference.conf:$!/n";
     @content = <MYFILE>;#content中每一个元素就是一行
     close(MYFILE);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值