Perl CGI简介

 

发信人: 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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值