Perl CGI入门

/ns/cn/jc/data/20020801041544.htm

转帖





.1 Unix环境



本教程将与您一起学习在Unix平台上用Perl创建CGI。和其它教程不同,我们并不假设
你了解CGI、Perl或Unix。
学完本教程后,你将能够建立Perl的计数器、留言板和处理安全口令的程序。同时你也
会对Perl语言有所了解,学习使用其变量、if语句和循环。
什么是CGI?
CGI代表通用网关接口(Common Gateway Interface)。本质上,CGI是运行在服务器上
的程序。它可以用任何语言编写
- 只要能够在你的服务器上运行。Perl之所以能够成为CGI编程的首选,是因为它可以
适应所有的平台,而且拥有很多对Web来说非常理想的工具。
当我在一个网页上填充一个form并按‘Submit‘时,有2件事在服务器上发生:
敲入或选择的所有信息被拷贝到服务器。
服务器寻找在form顶部确定的程序,然后运行之。
程序做的第一件事通常是请求网页form中的内容,然后把它赋给变量。然后程序可以查
询数据库、发送一封电子邮件或加入留言板、或者任何你想做的事。
我们通过例子学习教程。对每个新的主题,我们查看整段代码,然后分成小片段并进行
讨论。在你在Unix服务器上使用Perl之前,应该对Unix有一些了解。
Unix环境
你应该会用Telnet登录到Unix服务器上以便能用Perl创建CGI。
你也应该能把文档FTP到服务器上。
实际上,Unix是一种最强大和灵活的操作系统。当作为终端使用时,用户用一种称为
X-Windows的图形用户界面。X-Windows因为在互联网上太慢而无法使用,所以我们将使
用命令行方式。
命令行提示
每次在Unix中输入新的一行,将得到一个命令行提示。通常以机器名然后跟着一个%或#
字符的形式出现。这是输入基本命令来创建、拷贝、移动和删除文件的地方,还可以做
其它事情。
试试这些联系:
打开你最喜欢的Mac或PC字处理器。对于HTML来说,用一种简单的能把代码存成纯文本
的编辑器。敲入这行:This
is a dummy sentenc.
把文件保存为practice.txt。
用FTP程序把这个文件上载到服务器上。注意:应该以ASCII的方式上载你的CGI文件,
不能用binary方式。
用TELNET程序访问你的Web服务器。
用你的用户名和口令LOGIN。
敲入ls然后按回车键(注意:使用小写,Unix区分大小写),你的Web服务器中的内容
将列在屏幕上,应该能够看到你的practice.txt。
敲入pwd然后按回车。pwd代表“打印工作目录(Print
Working Directory)”。从服务器的ROOT目录到你的当前目录的路径将显示出来。例
如,我的主目录是/home/usr/robyoung/htdocs。
敲入mkdir myfolder然后按回车 - 创建一个叫‘myfolder‘的目录。
敲入mv practice.txt myfolder/practice.txt然后按回车 - 把practice.txt移动到
myfolder中。
敲入cd myfolder然后按回车 - 进入myfolder目录。
敲入pwd然后按回车 - 路径名以/myfolder结束。
敲入ls然后按回车 - myfolder中的内容将显示出来 -
只有practice.txt。
敲入cp practice.txt copy2.txt然后按回车 -
做一个拷贝。
敲入ls然后按回车 - 将列出两个文件。
敲入rm copy2.txt然后按回车 - 删除这个文件。
敲入ls然后按回车 - 只剩下practice.txt。




1.2 chmod命令
创建CGI程序时,需要改变其访问权限以便能从网页中执行之。我们用chmod命令实现这
个目的。chmod命令有两个参数
- 谁拥有权限和他们将拥有哪些权限。
1.谁拥有权限?
有三类不同的权限:User、Group和Others - 用字母u、g和o表示。字母‘a‘表示所有类
别。
2.可以拥有什么权限?
有3种类型的权限:Read、Write和eXecute,用字母r、w和x表示。
权限通过等号赋予(=r、或=rw、或=rx),或者通过加号(+r或+rwx)或减号(-w或
-rwx)。
3.如何敲入命令?
对于大多数CGI程序,我想让所有人都有读和执行的权限,但没有写的权限,因此没有
人可以删除或编辑我的程序。下面是最常见的命令:
chmod a+rx filename.cgi
表示让所有人有读和执行的权限。当我创建一个文件时,我拥有完全的读、写和执行权
限,但其他人没有任何权限。这个命令让所有人可以运行我的程序。
在myfolder文件夹中试试这个例子:
入ls -l然后按回车。显示出关于practice.txt的很多信息,包括大小、拥有者和最后
保存的日期。
观察访问权限,可能是这样:rwx------或rw-r--r--或rw-r-----,前3个指明user权限
(读、写、执行)。然后的三个是group权限(无),最后的三个为other权限(无)。
敲入chmod a+rx practice.txt然后按回车 -
为所有类别增加读和执行权限。
敲入ls -l然后按回车 - 这时显示的权限为rwxr-xr-x,指明拥有者仍然拥有所有权限,
group和others有读和执行权限,但没有写的权限。
敲入chmod go-x practice.txt然后按回车。
敲入ls -l然后回车 - 现在的权限为rwxr--r--,指明拥有者仍有完全的权限,group和
others只有读的权限。
删除myfolder文件夹
敲入rm practice.txt然后按回车。
敲入cd ..
敲入rmdir myfolder




1.3 定位Perl和sendmail
定位Perl程序
每个Perl程序指明Perl在系统中的位置。于是外部的网页可以知道执行什么程序和去哪
找它。
从命令行提示符敲入which perl然后按回车。
系统返回类似这样的结果:
/usr/bin/perl

/usr/local/bin/perl
记下这个结果,这是你的系统中Perl的位置,以后会用到。
如果系统没有返回结果,再试试:
敲入whereis perl然后回车。
如果还没有得到Perl的路径,需要给你的系统管理员发一封EMAIL。
定位sendmail程序
敲入whereis sendmail,然后按回车。
会返回几个结果,其中一个以sendmail结尾。例如,我在我的系统上得到的结果是:
sendmail: /etc/sendmail.cf /etc/sendmail /etc/sendmail.st
/usr/lib/sendmail.no_mx /usr/lib/sendmail.mx /usr/lib/sendmail
/usr/lib/sendmail.hf
/usr/man/man8/send
以/usr/开始sendmail结束的是:/usr/lib/sendmail,这是我们要记下的。
如果你在定位Perl程序或sendmail程序时遇到问题,应该email给你的系统管理员,询
问正确的路径。




2.1 使用Emacs
当我已经有一个很好的PC上的图形界面的面向鼠标的编辑器时,为什么我还想要一个基
于文本的编辑器呢?答案是Emacs运行在你的Unix平台上,所以可以方便地做小的修改。
基本上当你维护你在Unix平台上的工作时,你有两个选择:
1. 在PC上使用图形界面的文本编辑器,然后FTP你的文件到Unix服务器上。当你做修改
时,保存你的修改,然后再FTP上去。这种方式的好处是你可以在一个舒适的、面向鼠
标的编辑器中做所有的工作。缺点是每次上传文件都要花费时间。
2. 用一种Unix编辑器,如Emacs,直接保存你的修改到服务器上。它的界面不太漂亮,
而且不能用鼠标,但一旦你用惯了,就能做任何事。我宁愿在做小的修改时使用Emacs,
而不愿每次上传文件。
开始Emacs教程:
敲入emacs然后按回车。屏幕将显示emacs编辑器环境。如果你的服务器显示“Emacs
not found”,那么你应该给你的系统管理员发一封Email,问问是否有可用的文本编辑
器并且是否有在线教程。
敲入[ctrl]-h然后按t。这时将调出教程。可能要花几个小时学习Emacs教程。你对
Emacs越了解,编辑Perl越容易。
要点:
保存文件 - 敲入[ctrl]-x然后按[ctrl]-s。
退出 - 敲入[ctrl]-x然后按[ctrl]-c。
打开文件 - emacs filename。



2.2 Perl简介




2.2 Perl简介
准备模板
在你的PC或Mac上建立一个文件夹 - perltour。
点击这里下载模板文件 -
template.txt。把它保存到perltour文件夹中。
在你最喜欢的文本编辑器中打开这个文件。
把第一行替换为你已经定位的Perl路径。对于Windows
NT用户:删除这行。你的机器使用.pl文件扩展名开定位Perl,所以要保证你的文件的
扩展名为.pl而不是.cgi。
找到文档的倒数第八行 - open(MAIL,
"|/usr/lib/sendmail -t") || die
把/usr/lib/sendmail替换为你已经定位的sendmail路径。
找到下一行 - "Content-type: text/text\n\nCan‘t open
/usr/lib/sendmail!";
把/usr/lib/sendmail替换为sendmail路径。
保存文件。
从现在开始你每次创建一个新的CGI时都可以拷贝这个template.txt文件。
建立一个测试文件
我们现在建立一个测试用的CGI程序然后上传到服务器上。
注意:有些服务器允许你的CGI程序可以在任何web目录中
- 只要文件名以".cgi"结束。有的服务器要求只能把它们放在
"cgi-bin"目录中。可以跟你的系统管理员确认是哪种情况。
拷贝template.txt到test1.cgi中(在NT上为test1.pl)。
打开test1.cgi然后找到#************BEGIN BODY*********
在这行后面加入一行:print "<h1>Hello
World</h1>";
保存文件。
如果不需要把脚本放在cgi-bin目录中......
用Telnet程序登录到你的Unix服务器上。
在Unix命令提示符下,敲入mkdir perltour然后按回车。
敲入chmod a+rx perltour然后按回车。
把test1.cgi文件FTP到perltour文件夹中。注意:应该以ASCII方式上传你的CGI文件,
不能用binary方式。
敲入chmod a+rx test1.cgi然后按回车。
敲入ls -l然后按回车。这时你可以看到test1.cgi的权限:rwxr-xr-x,表明任何人都
可以读和执行这个文件。
运行浏览器,输入你的主目录URL,把/perltour/test1.cgi加在URL后面。
如果需要把脚本放在cgi-bin文件夹中......
用Telnet登录到你的Unix服务器上。
向系统管理员询问cgi-bin的路径。
在Unix命令提示符下,敲入cd cgi-bin路径,然后按回车。
把test1.cgi文件FTP到服务器的cgi-bin文件夹中。注意:应该以ASCII方式上传你的
CGI文件,不能用binary方式。
敲入chmod a+rx test1.cgi然后按回车。
敲入ls -l然后按回车。这时你可以看到test1.cgi的权限:rwxr-xr-x,表明任何人都
可以读和执行这个文件。
运行浏览器,输入你的服务器的URL,把/cgi-bin/test1.cgi加在URL后面。例如, http://www.myserver.com/cgi-bin/test1.cgi。
Hello World将以大字母出现,表明CGI正常工作。



2.3 HTML FORM




2.3 HTML FORM
这页很简单 -
建立一个用户可以输入信息的基本的form。form顶部的<FORM>标记符有两个参数:
ACTION="path/to/myscript.cgi"和METHOD="post"。
把这个文件保存在perltour文件夹中,用文件名"test2.cgi"。
把下面代码拷贝到文件testform.htm中,然后把它FTP到perltour文件夹中。
<HTML><HEAD>
<TITLE> My first form </TITLE>
</HEAD><BODY>
<FORM ACTION="test2.cgi"
METHOD="POST">
First Name <INPUT NAME="first" TYPE=TEXT
SIZE=25><BR>
Last Name <INPUT NAME="last" TYPE=TEXT SIZE=25><BR>
E-mail <INPUT NAME="email" TYPE=TEXT SIZE=30><BR>
<INPUT TYPE=SUBMIT VALUE="Test it">
</FORM>
</BODY></HTML>
当用户点击form底部的submit按钮时,服务器将执行程序"test2.cgi"并把
用户输入的信息传递给程序。Method可以是POST或GET。
注意:如果你的服务器使用cgi-bin文件夹,你的HTML文件中的form中的script名前应
加上/cgi-bin/。例如,
<FORM ACTION="/cgi-bin/test2.cgi"
METHOD="POST">



3.1 回应脚本




3.1 回应脚本
这段脚本将显示输入到HTML FORM中的文本。它是一个信息如何传递给你的程序的简单
的例子。既然你现在已经有了一个有着正确的Perl和Senmail的路径的template.txt文
件,下面要做的只是编辑CGI的BODY部分。
拷贝下面脚本的BODY部分到template.txt,然后保存到一个新文件
"test2.cgi"中。
FTP test2.cgi到perltour文件夹(或cgi-bin)中。
然后在Unix提示符下,进入perltour(或cgi-bin)文件夹,敲入chmod
a+rx test2.cgi设置权限。
现在可以在你的浏览器中打开服务器上的testform.htm,测试这个form。当你填充这个
form并按"Test
It"时,CGI告诉你你输入了什么。
#!/usr/local/bin/perl
#
&readparse;
print "Content-type: text/html\n\n";
#
#*****************BEGIN BODY*************
print "<h1>Thank you for filling out the
form</h1>";
$firstname = $value[0];
$lastname = $value[1];
$email = $value[2];



print "Your first name is $firstname<BR>";
print "Your last name is $lastname<BR>";
print "Your e-mail is $email<BR>";




#***************END BODY******************



3.2 脚本解释




3.2 脚本解释
现在让我们看看这段代码。
#!/usr/local/bin/perl
#
&readparse;
print "Content-type: text/html\n\n";
#*****************BEGIN BODY*************
Unix上的每个CGI的第一行都是运行它的程序的路径。记住,你的可能与上面写的不同。
服务器将按这个路径定位Perl,然后用Perl解释器执行程序。这是唯一的有#并且对程
序有意义的一行。
程序其余部分的#只是注释,程序将忽略其后的内容。
第三行是一个命令,&readparse;。这是一个子过程,输入所有进入HTML
FORM中的文本。第四行对所有CGI都是必须的,它告诉服务器我们要打印的任何信息都
应该返回HTML文档。
这些行永远不会改变,因此下面我们集中在BODY部分的内容上。



3.3 BODY部分




3.3 BODY部分
#*****************BEGIN BODY*************
print "<h1>Thank you for filling out the
form</h1>";
$firstname = $value[0];
$lastname = $value[1];
$email = $value[2];



print "Your first name is $firstname<BR>";
print "Your last name is $lastname<BR>";
print "Your e-mail is $email<BR>";



#***************END BODY******************
对于Perl,我们需要知道:
每行以分号结束。
变量以$开始。
第一行很直接 - print将打印随后的内容到屏幕上。要打印的内容必须在引号内,其中
可以包含HTML标记符。
readparse子过程自动把HTML FORM中的内容放入一个称为value的数组中。这样,第一
个文本框中的内容是$value[0],第二个文本框中的内容是$value[1],等等
- 数组下标以0开始。
第二行我们执行命令:
$firstname = $value[0];
这个语句创建一个称为$firstname的新变量,把$value[0]的内容赋给它。这意味着在
HTML
FORM中第一个文本框中输入的信息将包含在变量$firstname中。
第三行和第四行与此类似:
$lastname = $value[1]; $email = $value[2];
很明显,这两行分别把第二个和第三个文本框中的内容赋给变量$lastname和$email。
程序的最后三行把文本和变量打印到屏幕上。
print "Your first name is
$firstname<BR>";
print "Your last name is $lastname<BR>";
print "Your e-mail is $email<BR>";
注意变量被包含在双引号中。在其它语言,如JavaScript中,我们必须显式的连接文本
和变量。在Perl中,当它看到$时,就会使用变量的内容。不错,是吧?但是要注意,
只有双引号才能这样,单引号只是从字面上引用其中的内容。



4.1 email子过程




4.1 email子过程
#*****************BEGIN BODY*************
print "<h1>Thank you for filling out the
form</h1>";
$firstname = $value[0];
$lastname = $value[1];
$email = $value[2];



print "Your first name is $firstname<BR>";
print "Your last name is $lastname<BR>";
print "Your e-mail is $email<BR>";
$to = $email;
$from = "clinton\@whouse.gov";
$sub = "subject of my first e-mail";
$body = "The form was filled out by $firstname $lastname
Thank you goes on another line.";
&email($to,$from,$sub,$body);



#***************END BODY******************
在上面的例子中,我在程序的BODY后面增加了7行。你需要拷贝这些行到test2.cgi的
BODY中。有两种方式:
在PC上的文本编辑器中进行拷贝和粘贴,然后用FTP重新上传,这时不必重新运行chmod。
可以在Unix提示符下运行Emacs或Pico,对文件进行修改,然后保存和退出。
这时你可以再试试form。要在testform.htm页面中输入你自己的邮件地址。当你提交这
个form时,显示结果与以前一样。但如果你在几秒种后查看你的e-mail,你会看到一封
来自President
Clinton的消息。
让我们看看这些行:
$to = $email;
- 拷贝变量$email中的内容到变量$to中。
$from = "clinton\@whouse.gov";
- 设置变量$form为clinton@whouse.gov。反斜线(\)称为escape
character。@符号在Perl中有特殊意义,表示一个数组,这时,如果我们不想引用数组,
而只用@符号本身,需要在前面加一个"\"。
例如,如果我敲入下面这行:
$amount = "He owes me $20.00";
将得到一个错误,因为Perl将试图访问一个称为$20.00的变量。我们可以这样写:
$amount = "He owes me \$20.00";
$sub = "subject of my first e-mail";
这行很直接。
$body = "The form was filled out by $firstname
$lastname Thank you goes on another line.";
这只是一个命令 - Perl命令总以分号结束。返回的字符是赋给$body的字符串中的另一
个字符。这很方便,因为可以敲入引号,然后象在字处理器中一样敲入多行文本,然后
用引号结束。最后,象其它语句一样敲入引号。
也可以象这样而得到相同的结果:
$body = "The form was filled out by $firstname
$lastname \n Thank you goes on another line.";
\n为换行符 - 当双引号中包含\n时,把它翻译成回车符。这对email也起作用
- 它是用Ascii,而不是HTML写的。注意HTML不在意源代码是在一行还是在多行。如果
想在HTML中加入一行,需要插入一个<BR>或<P>标记符。
&email($to,$from,$sub,$body);
email子过程在下面的readparse子过程中定义。它被配置成很好用,只需简单地敲入
&email( addressee , reply-to, subject, message body)
例子中也可以这样传递参数:
&email($email,"clinton\@whouse.gov","subject
of my first e-mail","This is line 1 \nThis is line 2");
但是我认为分别赋值对于程序的编辑和阅读更容易。



4.2 写文件




4.2 写文件
下面我们建立一个允许访问者输入信息到留言板的页面文件。
留言板程序一般原则email,因为信息存储在数据库中意味着它可以被存储、过滤、管
理和输出。
要创建留言板,我们需要在perltour文件夹中建立3个文件:
gusetbook.htm - 用户在浏览器中填充的form。
guestbook.cgi -
从网页获得信息并处理之的程序。
guestbook.log -
包含所有数据的不限制大小的文本文件。
过程很简单,guestbook.cgi是从网页获得name、address、city、state、zip、phone
number和comments,然后在guestbook.log文件中附加一行的程序。
我们首先建立用户输入信息用的HTML页面文件。form包含10个元素和一个submit按钮。
拷贝以下的代码到文本编辑器中,并保存为guestbook.htm。
注意:如果你的服务器用cgi-bin,应在<FORM>标记符中的guestbook.cgi前加入
/cgi-bin/。
然后把这个文件上传到perltour文件夹中。
<HTML><HEAD>
<TITLE> My Guestbook Page </TITLE>
</HEAD><BODY bgColor="beige">
<H1 ALIGN=‘CENTER‘> Please sign our guestbook
</H1>
<TABLE BORDER=0 width=100%>
<FORM ACTION="guestbook.cgi" METHOD="post">
<TR><TD> First Name <TD> <INPUT
TYPE=TEXT NAME="first" SIZE=25>
<TR><TD> Last Name <TD> <INPUT TYPE=TEXT
NAME="last"
SIZE=25>
<TR><TD> Address <TD> <INPUT TYPE=TEXT
NAME="address"
SIZE=40>
<TR><TD> City <TD><INPUT TYPE=TEXT NAME="city"
SIZE=25>
<TR><TD>State <TD><INPUT TYPE=TEXT NAME="state"
SIZE=2>
<TR><TD>Postal Code <TD><INPUT TYPE=TEXT
NAME="postal"
SIZE=9>
<TR><TD> Telephone <TD> <INPUT TYPE=TEXT
NAME="phone"
SIZE=25>
<TR><TD> e-mail <TD> <INPUT TYPE=TEXT
NAME="email"
SIZE=25>
<TR><TD> Add me to<BR>your mailing list
<TD><INPUT
NAME="maillist" TYPE=CHECKBOX CHECKED>
<TR><TD> Comments <TD>
<TR><TD COLSPAN=2><TEXTAREA NAME="comments" ROWS=6
COLS=80></TEXTAREA>
<TR><TD><TD> <INPUT TYPE="SUBMIT"
VALUE="Send my
comments">
</FORM>
</TABLE>
</BODY></HTML>



4.3 建立log文件




4.3 建立log文件
当运行CGI程序在留言板中添加信息时,我们需要告诉它在guestbook.log底部附加一新
行。因此我们需要有一个guestbook.log文件。
把下行拷贝到一个新建的文本文件中,在此行的结尾按回车,然后保存为
guestbook.log:
First::Last:ddress:ity::State::Postal::Phone:-mail::list:omments
把这个文件FTP到服务器上的perltour文件夹中。
在Unix提示符下,敲入chmod a+rx guestbook.log,然后按回车。



5.1 留言板CGI代码




5.1 留言板CGI代码
#********* BEGIN BODY********************
open (LOGFILE, ">>guestbook.log");
$newline=join(‘::‘,@value);
print LOGFILE ("$newline\n");
close LOGFILE;
print "<BODY BGCOLOR=\‘BEIGE\‘><H1>Thank
you. Your comments have been added</H1>";
#******** END BODY************************
这是guestbook.cgi程序的BODY部分。你应该这样:
拷贝以上代码到template.txt文件的BODY部分。
保存为guestbook.cgi。
上传guestbook.cgi到服务器的perltour文件夹中。
在命令提示符下敲入chmod a+rx guestbook.cgi。
现在可以测试form了。如果没有错误,将返回一个米色的感谢你的页。可以在Unix命令
提示符下敲入cat
guestbook.log查看文件的内容。



5.2 代码详解




5.2 代码详解
#********* BEGIN BODY********************
open (LOGFILE, ">>guestbook.log");
$newline=join(‘::‘,@value);
print LOGFILE ("$newline\n");
close LOGFILE;
print "<BODY BGCOLOR=‘BEIGE‘><H1>Thank you.
";
print "Your comments have been added</H1>";
#******** END BODY************************
代码的第一行是:
open (LOGFILE, ">>guestbook.log");
这行为要写的guestbook.log做准备。open命令用来打开文件进行输入和输出。这里的
"LOGFILE"称为文件句柄。后面,当我想对guestbook.log文件进行附加操作
时,可以用print
LOGFILE。对于程序的其余部分,LOGFILE就表示guestbook.log。后面的文件名以两个
大于号开始,这是常用的文件操作方式中的一种,我们常用的操作方式有三种:
< - 打开文件进行输入操作(读文件)。
> - 打开文件进行写操作(覆盖文件)。
>> - 附加操作。
下一行是join语句。这是一个把数据加入无限制的文本文件的非常有用的工具。
$newline=join(‘::‘,@value);
表示在数组@value中的每个值之间加入两个分号。
$newline现在包含的内容为:
Robert::Young::5 Main St.:nytown::MA::02177:617)
555-1212::robyoung@mediaone.net:n::This is Great
现在可以把$newline加入到guestbook.cgi的最后。因为log文件已经有了一个句柄,可
以这样操作:
print LOGFILE ("$newline\n");
并且在$newline后面加一个换行符,以后在加新内容时,将以新行开始。
close LOGFILE;
- 关闭文件。
最后,在屏幕上输出一些信息。这不只是礼节。所以可以这样:
print "<BODY BGCOLOR=\‘BEIGE\‘><H1>Thank
you. Your comments have been added</H1>";



5.3 读取log文件




5.3 读取log文件
print "</TABLE>\n";
#********* END BODY********************
拷贝以上代码到template.txt文件的BODY部分。
保存为getlog.cgi。
把getlog.cgi用FTP上传到服务器的perltour文件夹中。
在Unix提示符下,进入perltour文件夹,敲入chmod a+rx
getlog.cgi。
在浏览器中打开http://your.server.name/perltour/getlog.cgi,屏幕将显示所有用
户输入的信息。
这段代码与前面的正相反,它从log文件中读信息。
open(LOGFILE, "<guestbook.log");
打开guestbook.log文件进行输入工作。
@entries=<LOGFILE>;
把文件的内容输入到数组@entries中。
print "<BODY bgcolor=beige>\n"
;
print "<TABLE>\n";
写HTML文件的起始部分。
foreach $line(@entries){
对于数组@entries中的每一行。
@fields=split(/::/,$line);
用::分割$line到数组@fields中。
print
"<TR><TD>$fields[0]$fields[1]<TD>$fields[9]\n";
}
在表格中打印数组@fields中的信息。
print "</TABLE>\n";
表格结束。



6.1 设置口令




6.1 设置口令
CGI的一个有趣的特征是即使任何用户都能执行它们,但却没有办法在屏幕上显示她们。
这意味着可以做一个口令脚本:
#********BEGIN BODY**************
if ($value[0] ne "mypassword") {
print "Invalid Password";
} else {
print ‘
<BODY BGCOLOR="WHITE">
<H1> Welcome, you have entered the<P>
Password protected site </H1>
‘;
};
#*********END BODY***************
要用这个脚本,需要建立一个有form的HTML页面。如果在form上只有password一个box,
则在运行脚本时它传递给$value[0]。
和JavaScript不同,用户看不到源代码,所以使用以下代码是安全的:
if ($value[0] ne "mypassword") {
第一行为IF语句,与在JavaScript中的用法相似。
在Perl中,IF语句不同,取决于是比较数字还是文本。比较数字,可以用==,
!=, >,
上面的语句确定在用户输入的文本不等于"mypassword"时将做什么。
print "Invalid Password";
口令不对时打印某些信息。
} else {
否则...
print ‘
<BODY BGCOLOR="WHITE">
<H1> Welcome, you have entered the<P>
Password protected site </H1>
‘;
口令正确,进入有口令保护的网站。




6.2 计数器
下面是一个简单的计数器程序:
#******** BEGIN BODY ********
open (GETCOUNT,"<count.log");
#open count log for input
$counter=<GETCOUNT>;
#assign contents of file to $counter
close (GETCOUNT);
#close access to file
$counter++;
#increase $counter by 1.
print "$counter hits";
#print number of hits to users screen
open (PUTCOUNT,">count.log");
#open count log for output
print PUTCOUNT ($counter);
#replace old counter value with new one
close PUTCOUNT;
# close access to file
#******** END BODY *********
如果用SUBMIT按钮,当前页将消失,出现程序的输出页。为了在当前页上显示点击数,
需要有一个页面转载时执行的程序,然后把结果潜入相同页面上。这种方法叫做Server
Side Include(SSI)。
注意:不是所有的web服务器都支持SSI。有些只在页面文件以".shtml"或
".html-ssi"结束才起作用,有些由于安全原因完全屏蔽了这种功能。
下面是代码的工作过程:
把上面的代码拷贝到一个新的‘template.txt‘文件中,命名为count.cgi。
建立一个包含起始点击数的文件,命名为count.log。
新建一个HTML页面。
插入<!--#exec cgi="count.cgi"-->。
把上面3个文件上传到服务器上。
Telnet到perltour文件夹中,敲入chmod a+rx count.cgi。
浏览这个页面,重载几次,可以看到数字的增加。
如果不起作用,直接浏览count.cgi看它是否工作。一旦CGI起作用,把页面文件重命名
为.shtml扩展名.