发信人: chenhao (努力学习), 信区: Linux 标 题: Perl CGI简介 发信站: 北大未名站 (2000年11月19日15:57:07 星期天) , 转信 Perl CGI简介 Perl是一个庞大的系统,不 过,我一般只用它写一个留言板什么的,再就是代替shell做 一些简单的工作。缺省 时,linux的perl 5安装在/usr/bin下,命令是/usr/bin/perl. perl的语法介于C和basic之间,大概的规则是这样的: (1)所有变量都不需 要提前声明。 perl的变量有普通变量, 数组和关联数组三种。普通变量就是数值和字符串,例如 $string1="aaa"; $test=5; $u=1.33; 数组用@字符标志,如 @name1=("tom","marry","john"); $b=$name[0]; $b现在等于"tom" $b=@name[0];跟上一句是一样的 $name[0,2]=["help","so"];现在@name等于[“help","marry","so"] @name[0,2]==@name[2,0];交换0,2元素 $name[3]="app";增加一个元素 $count=@name;取得name的元素个数 关联数组是一种特殊的数组,每个元素都由一对元素构成,如: %arr=(1,"one",2,"two",3,"three",4,"four"); 这时可以用前面的值(key)来索引后面的值: $one=$arr{1};这时$one等于"one" $arr{5}="five";增加一对数据 @X=%arr;变成普通数组X。 delete $arr(2);删除(2,"two")这对数据。 $arr{4}="fouth";改变数值。 注意所有语句的结束句都是; (2)基本函数: # 注释 print 显示,写文件,如 print "hello/n"; print FILE "hello/n";向FILE对应的文件写,FILE是一个handle; open 打开文件 close 关闭文件 一个例子是: #******** $filename="test"; open (FILE,"$filename")||die "can not open file!); #以读方式打开文件,如果要改成写方式,用open (FILE,">$filename"), <是读,>是写 ,>>是追加;die后边是如果出错显示的字符串。 while($line=<FILE>{ #读入文件内容,每次一行 print "$line"; } close(FILE); #*********** split 分割字符串,格式split(/模式/,$string); 例如$string="i:am:perl"; @list=split(/:/,$string); #这时@list=("i","am","perl") ($a,$b,$c)=split(/:/,$string); keys(%ARRAY) 取出%ARRAY中所有的索引key。 values(%ARRAY) 取出%ARRAY中所有的value reverse(@array) 把@array反转排列。 sort(@array) 排序 chop($string) 删除字符串的最后一个字符,通常用于去掉回车 lenth($string) 取字符串长度 substr($string,offset,length) 取字符串子串 index($string,$substring) 在$string中查找$substring,返回偏移量,如果 不存在就 返回-1。 push(@array,$string) 在@array末尾加入$string pop(@array)删除@array的末尾元素并返回这个元素 shift(@array)删除@array的开头元素并且返回这个元素 join($string,@array) 在@array中间加入$string并返回结果 grep(/pattern/,@array)在@array中用正则方式查找符合条件的元素 hex($string)将16进制转化为十进制 rand 产生随机数,注意必须先执行过srand localtime 返回时间数组 die LIST 显示字符串并且退出程序 pack("格式”,LIST)把一个LIST转换成指定的二进制格式,例如: $string=pack('C",65)这时$string等于ASCII的65,即"A" read 读文件,格式是read (Filehandle,$string,length),要得到标准输入, 使用STDI N的句柄 还有一个读文件的办法,如 $filecontent=<FILE>;读入FILE对应的内容 或者$input=<STDIN>;读标准输入 ``执行外部命令,`是大键盘最左边键,如`ls`执行ls命令。 (3)运算符 基本上和C是一样的,如+ - * / %,&&,|| !等,还有就是区段算符.., 如@digits=(1..9) 则@digits等于(1,2,3,4,5,6,7,8,9),还可以用@a=(1..3,'A',... 'Z')等 perl的字符比较命令有gt,ge,le,lt,eq,ne,cmp等等,但是最有用的是连接符.例 如 $str1="string1"; $str2="string2"; $string3=$str1.$str2;这时$string3等于"string1string2" perl还有一些文件测试运算符 -t $file 如果$file可读,返回1 -w $file 是否可写 -x $file 是否可执行 -e $file 是否存在 -o $file 是否为拥有者 -s $file 返回文件大小 -f $file 是否为正常文件 -T $file 是否文本 -B $file 是否二进制文件 -M $file 文件从更新到现在的日期数 (4)流程控制 跟C语言很接近拉: if(...){ clause; } if(...){ clause1;} else { ... } if ... elseif.... else... unless(....){ .... } else { ... } 呵呵,perl加的 while(....){ .... } do { ..... } while(...) until(....){ .... } for(...;...;...){ ..... } 跟C的一样 foreach $variable(@array){ ....... } 把@array的内容一条一条赋给$variable并执行里面的语句。 last if 用在循环里,相当于break; next if 相当于continue. (5)文字处理运算 基本方式是$string=~(文字处理 模式) perl的文字处理运算模式太强大了,这里只能介绍几个: 首先解释一下pattern的概念.pattern一般是用两个/字符夹在一起的一些字符串, 用来代 表一些具有某些特点的字符串, 常用的有: 任意字符串:寻找该字符串 [0-9]查找所有数字字符 [a-z]所有小写字母 [^0-9]所有的非数字 [^a-z]所有的非小写字母 [A-Z]所有的大写字母 ^字符串开头的字符 $字符串结尾的字符 /d跟[0-9]一样 /D非数字字符 /w就相当于[a-zA-Z0-9] /W相当于[^a-zA-Z0-9] /s一个空白的字符 /S非空白的字符 /d+一个相当于数字的字符串 /w+一个完全由数字或字符构成的字符串 /b一个不由英文字母或者数字为边界的字符串 /B一个由字母或数字为边界的字符串 a|b|c符合a,b,c之一的字符串 /pattern/i i代表忽略大小写 []找寻符合[]内的字符 ?{m}正好是m个指定的字母 {m,n}多于m少于n个指定的字符 /如果要引用一些在pattern中具有特殊意义的字符,使用/前缀 在perl的文本运算模式中,最常用的是=~或者!~运算符号和s,tr两个函数,特别是可以 使用 变量,例如: $string="chmod711cgi"; if($string=~/chmod/"){ print "Found chmod!/n";} =~是匹配成功,!~是匹配失败 tr是串转换函数,例如: $string=~tr/a-z/A-Z/; 将字符串中的小写字母转换成大写. s是串取代函数,例如: $string=~s/a/A/; 把第一个a换成A,还可以加后缀g表示全程替换,例如: $string=~s/1/A/g; 变换后,$string变成chmod7AAcgi. 注意tr和s的区别,tr的多替换一般是一对一的,而s是字符串的替换,长度可以改变,例如 $string=~s/1/ONE/g; 将变成chmod7ONEONEcgi. 还有一个很实用的功能是变数替换,例如: $string="test24"; $string=~s/(/d+)/<$1>/; 这时,s首先搜索满足/d+(数字)的串,得到24,然后送入$1,接着再套上<>,结果是 "test<24 >". (6)CGI的输入输出 很难一句话说清,这里给大家一个例子程序吧: #board.html 留言板的例子 <HTML> <FORM METHOD="POST" ACTION="/cgi-bin/board.pl"> <P>你的姓名:<INPUT NAME="name" SIZE="20"></P> <p>你的电子邮件地址:<INPUT NAME = "email" SIZE="30"></P> <p>你的意见:</p><p><TEXTAREA NAME="suggest" COLS=30 ROWS=4></TEXTAREA></p> <INPUT TYPE="submit" value="执行"> <INPUT TYPE="reset" value="取消"> <br> <P><center><a href="index.html">返回首页</a> <a href="data.html">观看留言</a></center></p> </FORM></HTML> ******** #PERL的CGL处理程序 #! /usr/bin/perl 告诉httpd程序到哪里去找perl $|=1;必须有这一行,关掉I/O缓冲 print "Content-type:text/html/n/n";#设定输出格式 read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); #把html的输入读如到$buffer中,注意这时的#$buffer是一个长字符串 #CGI程序是使用STDIN和STDOUT输入输出 @pairs=split(/&/,$buffer); foreach $pair(@pairs){ ($name,$value)=split(/=/,$pair); #把pairs拆分成不同输入框名字和输入内容的关联数组 $value=~s//+/ /g; #注意CGI把所有的输入空格转换成+,所以要变换回来,(如果你输入了+呢? 呵呵) $value=~s/%40/@/g;CGI对特殊字符进行编码,@是%40 $value=~s/%0D%0A/<br>/g; $value=~s/%0d%0a/<br>/g; $value=~s/%0a/<br>/g; #这三行把回车换成HTML的<BR> $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; #CGI把中文全部变成16进制编码,所以要用pack转换回来 这样的用法在prl里面是十分常见的. $FORM{$name}=$value; } print "<title>留言板</title>"; print "<h1>留言板</h1><br>"; foreach $check(values%FORM){ if($check eq ""){ print "<hr size=3>"; print"<h2>不能有空白字段!</h2>"; print"<hr size=3>"; exit; } } $filename="/home/httpd/html/book/data.html"; open(FILE,">>$filename")||die"Can't Open $filename!"; print FILE "我的名字:$FORM{'name'}<br>/n"; print FILE "我来自:$ENV{'REMOTE_HOST'}($ENV{'REMOTE_ADDR'})<br>/n"; print FILE "电子邮件地址:<a href=mailto:/"$FORM{'email'}/">$FORM{'email'}</a> <br>"; print FILE "留言:<P>$FORM{'suggest'}"; print FILE "<hr><br>/n"; close(FILE); #上面的一段很简单拉,将解码后的信息写入data.html print "<br><hr size=3>"; print "<h2>谢谢赐教!<BR>"; print "如果在留言板中没有看到你的留言,请按刷新按钮。<br>"; print "观看<a href=/" /data.html/">留言板</a>"; #不用解释了吧 最后,把board.html拷贝到html目录,board.pl拷贝到cgi目录(参考apache指南) 然后给board.pl设置可执行,而且要设置一个对html目录可写的uid(否则,修改apache配 置里的user),就可以使用留言板了。 (7)最后的话 Perl实在不是可以这样一篇文章说清的,建议你看一看机械工业出版社的《CGI编程指南》 ,蔡奇玉写的。 -- ※ 来源:.北大未名站 bbs.pku.edu.cn [FROM: 162.105.45.129]