一个小项目,用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); |
转:perl-项目总结
最新推荐文章于 2024-06-03 09:55:08 发布