目录 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章

CGI简明教程第六章

  对于本章的程序----选票程序,我不想多说什么。我只是想在本程序内教给大家如何

使用perl语言或C语言如何处理字符串的实例。让我们先看看代码:

页面文件--pote.html

<HTML>

<TITLE>投票程序</TITLE>

<h1>投票程序</h1>

<FORM METHOD="post" ACTION="/cgi-bin/vote.pl">

一.你喜欢谁?<br>

<input type="radio" name="idol" value="A" checked>张德陪<br>

<input type="radio" name="idol" value="B">阿加西<br>

<input type="radio" name="idol" value="C">桑普拉斯<br>

<input type="radio" name="idol" value="D">贝克<br>

<input type="radio" name="idol" value="D">顾懿<br>

<input type="submit" value="执行">

<input type="reset" value="取消">

</form>

查询<a href="/cgi-bin/vote.pl?command=view">选举投票结果</a>

</html>

CGI程序:--vote.pl

#!perl

print"Content-type:text/html\n\n";

print"<titel>投票系统</title>";


if($ENV{'REQUEST_METHOD'}eq"POST"){

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});

}elsif($ENV{'REQUEST_METHOD'}eq"GET"){

$buffer=$ENV{'QUERY_STIRNG'};

}

@pairs=split(/&/,$buffer);

foreach $pair(@pairs){

($name,$value)=split(/=/,$pair);

$value=~tr/+//;

$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;

$FORM{$name}=$value;}

$filename="/vote.dat";

%NAME=("A","张德陪","B","阿加西","C","桑普拉斯","D","贝克","E","顾懿");

if($ENV{'REQUEST_METHOD'}eq"POST"){

print"Content-type:text/html\n\n";

print"<titel>投票系统</title>";

print"<h1>投票系统的例子</h1>";

open(FILE,"<$filename")||die"不能打开文件,请和管理员联系\n";

for($i=0;$i<2;$i++){

$file[$i]=<FILE>;

$file[$i]=~s/\n$//;

}

close(FILE);

@item=split(/:/,$file[0]);

@vote=split(/:/,$file[1]);

for($i=0;$i<@item;$i++){

if($FORM{'idol'}eq$item[$i]){

$vote[$i]++;

last;

}

}

open(FILE,">filename")||die"Can't Open the file";

$item=join(":",@item);

$vote=join(":",@vote);

pirnt FILE "$item\n";

print FILE "$vote\n";

close (FILE);

print"<h2>您是投票给$NAME{$FORM{'idol'}},谢谢您的选票!<h2>";

print"查询<a href=\"/cgi-bin/vote.pl?command=viem\">投票结果系统</a>";

}

if($FORM{'command'}eq"view"){

print "HTTP/1.0 200\n";

print "Content-type:text/html\n\n";

print"<title>投票结果</title>";

print"<h1>投票结果</h1>";

open (FILE,"$filename")||die"文件打开错误";

for($i=0;$i<2;$i++){

$file[$i]=<FILE>;

$file[$i]=~s/\n$//;

}

close(FILE);

@item=split(/:/,$file[0]);

@vote=split(/:/,$file[1]);

print"<table border=1>";

for($i=0;$i<@item;$i++){

print"<tr><td>姓名</td><td>$NAME{$item[$i]}</td><td>票数</td>,td>$vote[$i]

</td><tr>";

}

print "</table>";

}

  这个程序是要各位学习Perl的分解字符串的功能。在Perl中,字符串操作

是非常简单的。

我对几句重要语句做一个分析:

if($ENV{'REQUEST_METHOD'}eq"POST"){

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});

}elsif($ENV{'REQUEST_METHOD'}eq"GET"){

$buffer=$ENV{'QUERY_STIRNG'};

}

  这是一个非常常见的功能块,几乎所有的CGI程序都会用到它。它判断

页面使用何种方式提交变量。如果是post,就从STDIN里把变量读出,存到

变量buffer里。注意在perl里,变量是用$开头的。而$ENV{'CONTENT_LENGTH'}

则是读出该变量的长度,请注意CONTENT_LENGTH是一个环境变量。第二个if则

处理get情况,在get情况下,页面提交的信息是存放在环境变量QUERY_STIRNG中

的。所以$buffer也就是页面提交的信息。环境变量REQUEST_METHOD表示方式,

它的值是一个字符串,前面加上$ENV则表示读出该变量的值。

@pairs=split(/&/,$buffer);

foreach $pair(@pairs){

($name,$value)=split(/=/,$pair);

$value=~tr/+//;

$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;

$FORM{$name}=$value;}

  以上功能块是一个分解过程。页面信息的提交往往是以“名称=值”的形式,

比如本例子中就是以“idol=顾懿”这样的形式提交的,所以我们要去掉字符串中

的"="等等信息,但同时要保留“idol”和"顾懿"之间的对应关系。$FORM{$name}

=$value做到这一点,这是一个关联数组。具体其中的语法,请各位自行查书。接

下来的就是文件的操作,但那已经不是本课的重点。所以就不多说了。