📄 perlcgi.htm
字号:
if ($mday < 10) {<br>$mday = "0$mday";<br>} </font></p><p><font>$month = ($mon + 1); </font></p><p><font>$localtime = "19$year</font>年<font>$month</font>月<font>$mday</font>日<font>$hour</font>时<font>\:$min</font>分<font>\:$sec</font>秒<font>";<br>}</font><br></p><p>好的 , 让我们来解释一下<font color="#FF0000"> &get_date </font><fontcolor="#000000">为什麽是 &get_date 而不是 &Time 或是其它呢</font></p><p><font color="#000000">原因很简单 请你注意 </font><font>sub get_date {}</font>这个叙述, sub 後面所跟的名字是 get_date,所</p><p>以我们就以 &这个符号来连结这个副程式的名字,我们之所以取名为 get_date只是</p><p>因为这一段 <font>sub get_date {}</font>副程式,我们所要取得的是时间,所以用 get_date来做为</p><p>它的名称,这样比较容易了解 ,当然你也可以用其它名称的.</p><p>接下来我们再来讨这个 <font>sub get_date {} </font>两个大刮号里面的叙述到底藏着什麽玄机 </p><p>, 为何<font>写下了一段 $today_date=&get_date; </font></p><p><font>然後</font> 载用 <font>print "</font>测试时间:<font>$today_date</font> " ; 你的浏 器就会输出 :</p><p>测试时间:<font>1998</font>年<font>5</font>月<font>09</font>日<font>23</font>时<font>:03</font>分<font>:39</font>秒<font> 这些字眼 </font>, 请听下面的分解 :</p><p><font>local($localtime); 意思是把这个 $localtime 变数宣告成 区域变数</font>,什麽是<font>区域变数</font></p><p><font>我们以後再作解释 </font>.</p><p><font color="#FF0000">($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); </font></p><p><font>localtime(time); 这个函数可以传回</font> 9 个有关时间的元素如 :</p><p><font>$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst</font></p><p>$sec 代表 秒 <font>, $min 代表 分</font>,<font> </font>$hour <font>代表 小时 </font>, $mon 代表 月, $mday代表 日, $year 代表 年.</p><p><font color="#FF0000">if ($sec < 10) {<br>$sec = "0$sec";<br>}<br>if ($min < 10) {<br>$min = "0$min";<br>}<br>if ($hour < 10) {<br>$hour = "0$hour";<br>}<br>if ($mon < 10) {<br>$mon = "0$mon";<br>}<br>if ($mday < 10) {<br>$mday = "0$mday";<br>} </font></p><p><font color="#000000">以上这些我们以 </font><font color="#FF0000">if ($min < 10) {$min = "0$min";} </font><font color="#000000">为例 它的意思是说 如果 $min 这个变数</font></p><p><font color="#000000">小於 10 的时候 就在 $min 这个变数前面加上一个 0 上去 , </font><font color="#FF0000">if ($min < 10) 是它的条件 ,</font></p><p><font color="#FF0000">{$min = "0$min";} 大括号里面的内容是它的叙述 .</font></p><p><font>所以当你 的程式写成 这样时 print "</font>测试时间:<font>$today_date</font> " ; 你的浏 器就会回应 :</p><p>测试时间:<font>1998</font>年<font>5</font>月<font color="#FF0000">09</font>日<font>23</font>时<font>:</font><fontcolor="#FF0000">03</font>分<font>:39</font>秒<font> 这些字眼</font>.</p><p><font color="#FF0000">$month = ($mon + 1); </font></p><p>$month 代表 月份 因为它 从 0~11 所以要加 1 才能符合真正的月份</p><p><font color="#FF0000">$localtime = "19$year年$month月$mday日$hour时\:$min分\:$sec秒";</font></p><p>这个时候 $localtime 变数会等於 1998年 某月 某日 某时 某分 某秒 (会按系统时间来显示)</p><p>当 $localtime 这个变数取得系统时间後 , 会将这个值传回l<fontcolor="#0000FF"> local($localtime);</font><font>这个区域变数</font></p><p><font>所以当我们把程式写成 </font><font color="#FF0000">$today_date=&get_date;</font> 这时 $today_date就等於 $localtime,所以</p><p>当你 print $today_date ; 你的浏 器就会回应 <font>"1998</font>年<font>5</font>月<fontcolor="#FF0000">09</font>日<font>23</font>时<font>:</font><font color="#FF0000">03</font>分<font>:39</font>秒<font>" 等字眼</font></p><p><font color="#FF0000">$counter="counter/counter.txt"; </font></p><p>(注) counter.txt 里面只有放置一组数字来作计数之用</p><p>当你写成 $counter ="counter/counter.txt"; (以Win95系统而言)如果你的WWW 伺服器是是安</p><p>装在 名为Website这个目录 那代表你的 counter.txt这个档案是放在 Website这目录底下counter</p><p>这个子目录里头</p><p><font>如果你是在 </font>Unix系统那 counter.txt 的路径就要写成绝对路径 , 如 $counter="/home/g65617</p><p>/counter/counter.txt";这代表在 Unix 系统下 我的目录是 g65617 然後我又在 g65617 底下 </p><p>设一个子目录 counter <font>再把 </font>counter.txt 放进去 counter这个子目路录里</p><p><font>有了放 </font>counter.txt 这个档案的路径之後,我们要如何去开启档案来使用呢,很简单,我们用</p><p><font>下面这一段程式码来说明 </font></p><p><font color="#FF0000">open(NUMBER,"$counter") || die $!;<br>$number = <NUMBER>;<br>close(NUMBER);</font></p><p><font color="#FF0000">$number++; </font></p><p><font color="#FF0000">print NUMBER $number;<br>close(NUMBER);<br></font></p><p>open(NUMBER,"$counter")||die $!; 这一段就是要开启档案程式的写法 , 用 open() 来开启 $counter</p><p>这个路径的 counter.txt 这个档案 <strong>, ||die $! </strong>代表如果开档失败会出现错误讯息 ,NUMBER 是一个</p><p>filehandle 它把counter.txt里面的资料内容存放在 $number这个变数里 .</p><p>$counter++就是把 counter.txt 档案里面的数字拿出来加 1 之後再用<fontcolor="#FF0000"> open(NUMBER,">$counter") </font></p><p><font color="#FF0000">|| die $!;</font><font color="#000000">将档案重新开启 , 再用 > 这个符号将 counter.txt 改写 (如果 counter.txt 本来存放的数字 </font></p><p><font color="#000000">为 5 在 $counter++改写了以後 就变成了 6 ) , 最後记的用 close () 这个函数把档案关掉.</font></p><p><font color="#FF0080">print "你是第 $number 位的受测者<p>"; </font></p><p><font color="#FF0080">print"我是来自於:$ENV{'REMOTE_ADDR'}<br>";</font></p><p><font color="#FF0080">print"测试时间:$today_date <p>"; </font></p><p><font color="#004080">$ENV{'REMOTE_ADDR'}是一个环境变数 , 当你用 </font><fontcolor="#FF0080">print"我是来自於:$ENV{'REMOTE_ADDR'}";</font></p><p><font color="#400040">在浏 器就会回应你的 IP 位址 </font></p><p><font color="#FF0080"><strong>%ANSWER=("1","A","2","C","3","C","4","C","5","B");</strong></font></p><p><font color="#000000"><strong>%ANSWER 是一个关联阵列 (</strong>以本表单为例 , 第一题答案是 A , 第二题答案是 C<strong>)一共</strong>有五题,</font></p><p><font color="#000000">所以我们的关联阵列写成 %ANSWER=("1","A","2","C","3","C","4","C","5","B");</font></p><p><font color="#000000"><strong>当</strong>我们用关联阵列<strong> </strong>%ANSWER=("1","A","2","C","3","C","4","C","5","B");来做成标准答案的时候</font></p><p><font color="#000000">我们又如何让使用者所送出表单上的答案来跟<strong>标准答案</strong>做一一的比对呢<strong> ?请看下面这一段的说明<br></strong></font></p><p><font color="#FF0080">$right=0;<br>$wrong=0; </font></p><p><font color="#FF0080">foreach $Num (sort keys %FORM)</font></p><p><font color="#FF0080">{<br>print "第 $Num 题你所答的答案是:$FORM{$Num} ";<br>print "标准答案:$ANSWER{$Num}<br>"; </font></p><p><font color="#FF0080">if ($FORM{$Num} eq $ANSWER{$Num}){<br>$right++;<br>}else{$wrong++;}<br>}<br></font></p><p><font color="#FF0080">$score=20*$right;<br>print "<p>您总共答对:$right 题;答错:$wrong 题<p>";<br>print "<p>您总共得到:$score 分<p>"; </font></p><p><font color="#000000">首先来看 </font><font color="#FF0080">foreach $Num (sort keys %FORM)</font><font color="#000000"> , 我们用 keys 这个函数将FORM的每个KEY</font></p><p><font color="#000000">取出存成一个阵列,再用 sort 这个函数来排序 (由小排到大)这时候 </font><font color="#8000FF">$Num</font><font color="#000000"> 所存放的是表单</font></p><p><font color="#000000">里 name 的值 </font><font color="#FF0080">. </font><fontcolor="#8000FF">$FORM{$Num}</font><font color="#000000">所存放的是表单里 value 的值 (请各别参照</font><font color="#FF8040">表单</font><font color="#000000">的原始档).</font></p><p><font color="#8000FF">$ANSWER{$Num}</font><font color="#000000">所存放的是 </font><fontcolor="#FF0080"><strong>%ANSWER=("1","A","2","C","3","C","4","C","5","B");</strong></font></p><p><font color="#000000"><strong>这个</strong>关联阵列由 $Num 所对应出来 A,C,C,C,B . </font></p><p><font color="#000000">我们运用 foreach 这个回圈 功能 从第一题到第五题 取出阵列里的元素,再来比对使用者</font></p><p><font color="#000000">所送出的答案.</font></p><p><font color="#FF0080">if ($FORM{$Num} eq $ANSWER{$Num}){<br>$right++;<br>}else{$wrong++;}<br>}<br></font><font color="#000000">这一段 读成 如果 </font><font color="#8000FF">($FORM{$Num} </font><font color="#400040">(也就是</font><font color="#000000">表单里 value 的值</font><fontcolor="#400040"> )</font><font color="#8000FF"> eq</font><font color="#400040"> (等於)</font><fontcolor="#8080FF">$ANSWER{$Num}</font></p><p><font color="#400040">(也就是我们所设定的标准答案 </font><fontcolor="#FF0080"><strong>%ANSWER=("1","A","2","C","3","C","4","C","5","B");</strong></font><fontcolor="#400040">里</font></p><p><font color="#400040">的 A,C,C,C,B)</font></p><p><font color="#8000FF">$right++;</font><font color="#FF0080"> </font><fontcolor="#400040">意思是 $right 这个变数加 1 的意思原本我们设定 $right=0 , 当答对 1 题时 $right </font></p><p><font color="#400040">这个变数就会 + 1 再答对 1 题时 $right 这个变数就会再 + 1 </font></p><p><font color="#0000FF">else{$wrong++;} </font><font color="#400040">意思是 : 如果答错 $wrong 这个变数自动加 1</font></p><p><font color="#FF0080">$score=20*$right;<br>print "<p>您总共答对:$right 题;答错:$wrong 题<p>";<br>print "<p>您总共得到:$score 分<p>";</font></p><p><font color="#000000">最後我们再设定一个变数 $score 把每题20分 乘以 答对的题数 存在 $score 里面 ,再用 print 这个</font></p><p><font color="#000000">函数 ,将它 输出到浏 器上面来, 於是程式应该写成</font></p><p><font color="#0000FF">print "<p>您总共答对:$right 题;答错:$wrong 题<p>";<br>print "<p>您总共得到:$score 分<p>";</font></p><p><font color="#000000">以上所述就是 表单与 CGI 应用程式间的互动,下次我们将介绍一些 </font><font color="#0000FF">Perl</font><font color="#000000"> 的常用的语法,敬请期待!</font></p><!--mstheme--></font></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -