发信人: 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]