摘自蔡奇玉、連振漢、張志強《CGI編程指南》第六章
為尊重作者版權,只作部分節選,以作推介之用,
推薦您購買原書閱讀!
6.1 Perl語言簡介
Perl(Practical Extraction and Report Language)叫做文字分析報告語言。是由勞利﹒華爾(Larry Wall)所建立出來的語言。他設計Perl時的哲學是以實用為第一優先,也就是語言容易使用,有效率,而且完整。Perl語言中包含了C、C++、shell script、sed、awk這幾個語言的語法,它原始的目的就是用來取代UNIX原來sed/awk與script的組合,用來匯整信息,產生報表的一個工具程序語言。且隨著版本的改進,功能越來越強,現在的功能已經超乎原先設計時的想象,幾乎任何事都可以做到,也變成每一部工作站必備的標準工具了。因為它對字符串與數據剖析方面有很強的處理能力,尤其是利用關聯性數組來作CGI應用程序剖析輸入數據串,可以說是一個功能強大的語言!
Perl這個解釋式的語言對國內的使用者來說可能都很陌生,甚至可能聽都沒聽過,為什之要用Perl來寫CGI應用程序呢?因為Perl有很強的字符串處理能力,在國外很多處理數據庫的軟件可以用Perl來溝通。在Perl5.0版本中還增加面向對象的用法、增加對字符串的處理能力、可以把整個文件當成一個字符串來處理、不受任何數據的大小限制而只受存儲器的大小、能夠處理DBM數據庫格式的數據也能夠處理二進制的數據等等,更重要的是Perl還可以在Unix、WindowsNT、Windows95、Dos、Linux、FreeBSD、OS2、Macitosh等操作系統中使用。目前還可以用Perl來和一些數據庫軟件溝通,在國外一些功能強大的CGI應用程序幾乎都是用Perl語言來當主角!讀者看到這裡一定會覺得功能這樣強大的語言Perl一定很難學!這您就大錯特錯啦,Perl是很容易上手的,它的語法和C語言很接近,對原本熟悉C語言的人來說,Perl是很容易上手的,只要有一點C語言的基礎,再加上幾個小時的學習時間就可以很輕易地用Perl語言寫一個簡單的CGI應用程序,至那些沒有C語言基礎的人,只要多花一點時間來學習,也是可以很快地使用Perl語言來寫CGI應用程序!那時候,您就會發覺原來Perl是那的平易近人,而寫出來的CGI應用程序也是那地簡潔有力,筆者相信Perl語言在CGI程序設計的舞台上一定是扮演著最佳男〈女)主角的角色。
在本章中先介紹Perl語言的語法,而在下一章中會介紹如何在Unix操作系統下使用Perl來寫CGI應用程序,最會在第8章中介紹如何在Windows95、WindowsNT這些32位操作系統中使用Peri來寫CGI應用程序。求知心切的您,是不是迫不急待地想知道Perl的功能是多的強大呢?
6.2 如何使用Perl來寫程序
如果在系統中已安裝了Perl的話,我們可以用“which perl”,或是“which perl5"這個指令來得知Perl是位系統的哪一個目錄下。
%which perl
/usr/bin/perl
或是
%which perl5
/usr/locaiAin/per15
之就可以利用Perl來寫程序碼了。如果想知道Perl版本的話,可以用“perl-v”或“perl5-v”,這個指令來得知Perl的版本。目前Perl的最新版本是5.x版,而以下所介紹的語法指令都可以在Perl4和Perl5版本中執行。如果不幸在工作站上找不到這個軟件的話,可以向系統管理員要求安裝這個非常實用的軟件。
接下來可以在工作站使用系統的文書編輯器(例如:vi、Joe、pico等等)來編輯程序碼,在程序碼的第一行一定要加上#!/path/per1程序起頭宣告。例如,用“which perl"這個指令來得知/usr/bin/perl這個路徑文件名,所以在寫程序碼的時候,一定要在程序碼的第一行寫上#/usr/bin/perl這一行程序起頭宣告,這樣系統才知道要到哪一個路徑下用哪一個執行文件來執行這個寫好的程序碼,接下來就可以在這個文件中寫程序碼了。這是Perl語言(解釋式)和C語言(編譯式)在程序寫作中最大的不同點。在C語言中是把原始程序碼編譯而成一個執行文件就可以在系統中執行,而Perl語言就要在原始程序碼的第一行使用#!再加上Perl的絕對路徑和文件名稱,以便告訴系統要使用Perl這個解釋器來解釋這些原始程序碼。
在寫完程序碼之,一定要把文件屬性改成可執行,例如可以把文件屬性更改成每個人都可以執行(chmod 711 filename)。不過,一般我們在寫CGI應用程序的時候,為了避免其他錯誤的發生,最好把CGI應用程序的文件屬性更改成每個人都可以有讀取、執行的權利(chmod 755 filename)。
而#這個符號在Perl語言程序碼中是代表注解的意思,Perl不會去處理這一行的敘述,所以在以下的范例中,如果出現這個符號的話,是代表筆者對程序碼的說明,在此先向讀者說明一下。
6.3 Perl語法介紹
為了讓大家對Perl語言有更深刻地了解,在介紹CGI應用程序之前,先來介紹Perl的基本語法,筆者先在本章中簡單扼要地替大家介紹Per1語言在CGI程序設計中最常用的語法函數,希望大家在看完這一章節之,能夠了解Perl語言是這容易上手。只要把這些基本語法熟悉之,就可以得心應手地用Perl來寫CGI應用程序。
6.3.1 Perl語言的變量
Perl的變量基本上有三種即純量變量(ScaiarVariable)、數組(Array)、關聯數組(Associative array),而以下是這些變量的使用方法:
一、純量變量(Scalar Variables)的用法
在Perl語言中變量的使用不像在C語言中還要事先宣告,在使用純量變量的時候要先加上$這個符號,要注意的是如果指定的純量變量是一個字符串的話,就要加上""這個雙引號符號了。如果是一個數值的話,就不用加上""這個符號了。以下是一些范例:
| $Strl=www"; |
#將www這個字符串指定給$Strl這個純量變量; |
| $str2="cgi"; |
#將cgi這個字符串指定給$str2這個純量變量; |
| $str3=$strl.$str2; |
#.就是把兩個字符串連起來,所以 $str3="wwwc20"; |
| $int=5; |
#將5這個數字指定給$int這個純量變量; |
| $int=3+2; |
#此時$int=5; |
| $int=3*2; |
#此時$int=6; |
| $int=l0;$int++; |
#此時$int=10+l=11; |
| $int=l0,$int+=5; |
#此時$int=10+5=15; |
二、數組(Arrays)的用法
在使用數組的時候要先加上@這個符號,以下是一些范例:
| @namel=("tom","mary"); |
#將"tom","mary"這兩個字符串指定給數組 @name1 |
| @name2=@name1; |
#此時的@name2=("tom","mary") |
| @pame3=("john",@name1); |
#此時的 (name3=("john","tom","mary") |
| ($one,@name4)=@name3; |
#此時的$one="john",而 @name4=("tom"'"mary") |
| @namel=0; |
#此時@name1為一個空數組 |
| @int=(1,3,5,7,9); |
| $x=@int; |
#將一個數組指定給一純量變量,就會返回數組元
#素的個數,所以此時的$x=5 |
| $x=$#int; |
#$#這個變量會返回數組最一個元素的index
#所以此時$x=4 |
|
($x)=@int;
| #$x等數組@int的第一個元素的值,
#所以此時$x=1 |
|
$b=$int[0];
| #$b等數組@int的第一個元素,所以$b=1 |
|
$C=@int[0];
| #$c也是會等數組@int的第一個元素,所以
#$c=1,因此要呼叫數組中的值有以上兩種方法 |
|
$int[0]=2;
| #將2這個數值指定給數組@int的第一個元素
#此時@int=(2,3,5,7,9); |
|
$int[0,1]=[1,3];
| #將1指定給數組@int的第一個元素,且將3指
#定給數組@int的第二個元素的,所以
#此時@int=(1,3,5,7,9); |
|
@int[0,1]=@int[1,0];
| #將數組@int的前兩個元素交換
#此時@int=(3,1,5,7,9) |
|
($int[0],$int[1])
| #也是將數組@int的前兩個元素交換 |
|
=($int[l],$int[0]);
| #此時@int=(1,3,5,7,9); |
|
@data=@int[0,l];
| #此時@date=(1,3); |
|
$int[5]=11;
| #將11這個數值指定給數組@int中第六個元素
#此時@int=(1,3,5,7,9,11) |
三、關聯數組(Associative arrays)的用法
關聯數組也是數組的一種,是由不同的純量變量所組成。不過和數組不同的地方是在關聯數組中的元素是由成對的key-value所組成的,也就是每一個key都有一個相對應的值(value),這是在Perl語言中特有的語法,所以初學者對關聯數組可能會比較陌生一點,筆者會在這裡作比較詳細的說明。如果能夠將關聯數組的語法應用在CGI程序設計中,就會發現關聯數組是一個很好用的語法。
在使用關聯數組的時候要先加上%這個符號,而關聯數組的格式如下:
%ARRAY=(keyl,value1,key2,value2,key3,value3...);
每一個key都有一個相對應的值(value)。
l.在關聯數組中增加、更改一對數據:
$ARRAY{key}=value;
在關聯數組ARRAY中加上一對key-value,要先在關聯數組名稱前加上$這個符號,而且key的名稱要在{}符號之間,最再指定key所對應的value值。如果在這個關聯數組中已經有這個key了,就會更改這個key所對應的value。
2.取出關聯數組中key所對應的value:
$get=$ARRAY{key};
取出在關聯數組ARRAY中key所相對應的value,要先在關聯數組名稱前加上$這個 符號,而且key的名稱要在{}符號之間,就會將key所對應的value取出來並指定給$get這個變量。
3.刪除一對在關聯數組中的數據:
delete $ARRAY{key};
delete是Perl所提供的函數,作用是刪除關聯數組中的一個key以及這個key所對應的value。使用方法是在delete函數之,再指定關聯數組中要刪除key的名稱。以下是有關關聯數組用法的一些范例:
| %NAMES=〈I'"one",2'"two"); |
| $one=$NAMES{1}; |
#此時$one等"one" |
| $two=$NAMES{2}; |
#此時$two等"two" |
| $NAMES{3}="third"; |
#增加一對key-value到關聯數組NAMES中
#此時%NAMES=(1'"one",2'"two",3'"third"); |
| $NAMES{3}="three"; |
#因為在關聯數組中已經有3這個key了,所以就
#會把key為3所對應的value更改成"three"
#此時%NAMES=(1'"one仰,2'"two",3'"three"); |
| delete$NAMES{3}; |
#將關聯數組中key值為3的一對key-value刪除掉,
#此時%NAMES=(1'"one",2'"two"), |
| @X=%NAMES; |
#將關聯數組NAMES指派給數組X
#此時@X=(1'"one",2'"two"); |
| %Y=@x; |
#將數組X指派給關聯數組Y
#此時%Y=(1'"one","two"); |
| %NAMES=(); |
#此時%NAMES為一個空的關聯數組 |
6.3.2 Perl在CGI程序設計中常用的函數
指令:#
說明:注解符號Remark宣告
范例:#本程序是一個示范注解說明
指令:print
語法一:print Filehandle LIST
說明:這個Filehandle可把它看作在I(Input)/O(Output)間的一個橋樑,可以利用Filehandle來做出數據讀入寫出的動作。stdin是代表從哪邊輸入數據,例如從電腦的鍵盤輸入,stdout是代表從哪邊輸出數據;例如從電腦的屏幕輸出;stderr是代表從哪邊輸出錯誤的數據,例如從電腦的屏幕輸出。而在Perl語言中有三個標準的Filehandle:
(一)STDIN(標準輸入):是代表stdin的Filehandle
(二)STDOUT(標準輸出):是代表stdout的Filehandle
(三)STDERR(標準錯誤輸出):是代表stderr的Filehandle
如果要使用其他Filehandle的時候,就要用open這個函數來打開一個Filehandle,我們可以用print這個函數把LIST的數據輸出給Filehandle。在為大家介紹print這個
函數之前,先讓我們來看看print函數中特殊打印符號字符:
| 符號 |
內定含意 |
| \n |
換行New Line |
| \r |
光標換行Return |
| \t |
Tab鍵 |
| \f |
換頁Form feed |
| \b |
退回一鍵Backspace |
| \v |
垂直Tab鍵 |
| \a |
響鈴Bell |
| \007 |
十進制ASCII碼 |
| \xff |
十六進制碼 |
| \c[ |
控制字符 |
范例:
print STDOUT"i love perl\n";
將“i love perl"再加上換行顯示屏幕上。
語法二:Print LIST
說明:如果省略Filehandle的話,就會把Filehandle內定為STDOUT。也就是會將LIST的數據內容顯示屏幕上。
范例:
$Str1ng="perl";
print"i love $string\n";
會將“i love perl”再加上換行顯示在屏幕上,而如果要讓雙引號內的變量失效的話,可以在變量前面加上\這個符號。例如如果是print“i love
\$string”;的話,就會顯示出“i love $string”這個字符串。
語法三:print
說明:同時省略Filehandle和LIST的話,就會以STDOUT為Filehandle,並會輸出$_這 個內定輸出變量的數據內容。如果$_變量是一個空字符串的話,就會顯示出一個空字符串。
范例:
$_="i love perl\n";
print;
就會將"i love perl"再加上換行顯示在屏幕上
指令:printf
語法一:printf Filehandle LIST
說明:在perl語言中也提供C語言中printf的語法,用法和C語言中的用法一模一樣。如果把Filehandle省略的話,也一樣會把STD0UT當成是內定的Filehandle。在為大家介紹printf函數之前,先讓我們來看看printf函數中變換符號的字符:
| 符號 |
內定含意 |
| %c |
字符
|
| %s |
字符串
|
| %d |
整數
|
| %f |
浮整數
|
| %h |
十六進制碼
|
| %o |
八進制碼
|
范例:
printf〈"chmod%d%s\n","7l1","cgi");
會將“chmod 7ll cgi”再加上換行顯示屏幕上。
指令:chop
語法:chop($string)
說明:把最一個字符刪除掉,常常用這個函數把換行的字符(\n)刪除掉。
范例:
$string="hello!\n";
chop($string); #此時$string="hello!";
而這兩行也可以寫成chop($string="hello!\n");
指令:split
語法:split(/pattern/,$string,limit)
其中/pattern是文字處理的模式,在下一小節中會有詳細的語法介紹。而limit是代表要分割的個數,可以省略。
說明:用一個指定的文字處理模式來分割$string字符串。
范例:
| $string="i;am;cute"; |
| @list=split(/:/,$string); |
#此時@list=〈"i","am","cute"); |
| ($a,$b,$c)=split(/:/,$string); |
#此時$a="i",$b="am",$c="cute"; |
| @list=split(/:/,$string,2); |
#此時@list=("i","love"); |
在傳送CGI應用程序數據的時候會先將數據編碼,其中會將FORM中每個數據字段的數據內容用&這個符號隔開,所以在解碼的時候就要以&這個符號為分割的字符,將每個數據字段分割出。例如:
| $string="who=A&email=B"; |
| @list=split(/&/,$string), |
#此時@list=〈"who=A","email=B"); |
而數據字段的名稱和這個數據字段的值是用=這個符號來隔開,如果想取得數據字段的名稱和所對應的值的話,就用要=這個符號來分割數據字段,例如:
| $list="who=A"; |
| (0$name,$value)=sp1it(/=/,$list); |
#此時$name="who";$value="A"; |
指令:keys
語法:keys(%ARRAY)
說明:取出關聯數組%ARRAY中全部的key。
范例:
| %NAMES=(1,"one",2,"two"); |
| @list=keys(%NAMES), |
#此時@list=(l,2); |
指令:values
語法:values(%ARRAY)
說明:取出關聯數組%ARRAY中全部的value。
范例:
| %NAMES=(1,"one",2,"two"); |
| @list=values(%NAMES); |
#此時@list=("one","two"); |
指令:reverse
語法:reverse(@array)
說明:將數組@array中的元素由到前重新排列。
范例:
| @list=("A","B","C","D"); |
| @1ist=reverse(@list); |
#此時@list=("D","C","B","A") |
指令:sort
語法:sort(@array)
說明:將數組@array中的元素由小到大排序,如果要由大到小排序的話,就要再加上reverse這個函數。
范例:
| @array=("b","c","a"); |
| @array=sort(@array); |
#此時@array=("a",b","c"); |
| @array=(reverse sort@array); |
#此時@array=("c","b","a"); |
| 這個語法也可以寫成@array=(reverse
sort(@array)); |
| @number=(l0,3.20); |
| @number=sort(@number); |
#此時@number=(l0,20,3); |
| 由上個范例可以知道如果要sort函數來排
序數值的時候,就會出差錯,因此要用下面這個方法才能正確地使用sort函數來排序。 |
| @number=(sort{$a<=>$b}@number); |
#此時@number=(3,10,20); |
指令:length
語法:length($string)
說明:求出一字符串$string的bytes值。
范例:
| $string="Perl"; |
| @size=length($string); |
#此時$size=4; |
指令:substr
語法:substr($string,offset,length)
其中offset代表起始字符的位置,length代表引用的字符串長度,如省略length的話代表從起始值到字符串的最一個字符長度。而offset如果是負值的話,就會從字符串右邊開始取出指定的字符串。
說明:在一字符串$string中取出想要的字符串。
范例:
| $x=substr("testing",2,2); |
#此時$x="st"; |
| $x=substr("testing",2); |
#此時$x="sting"; |
| $x=substr("testing",-2,2); |
#此時$x="in"; |
指令:index
語法:index($string,$substring,position)
其中$substring是指要尋找的字符,position代表要從哪一個位置開始找起,如省略position的話就從頭開始找起。
說明:返回所要找尋的字符在一字符串$string中的位置,如果在字符串中找不到字符的話,則會返回-l這個值。
范例:
| $x=index("testing","t"); |
#此時$x=0; |
| $x=index("testing","t",2); |
#此時$x=3; |
| $x=index("testing","perl"); |
#此時$x=-l; |
指令:push
語法:push(@array,$string)
說明:在數組@array的最一個元素附加新的元素string到數組@array中。
范例:
| @array=("one","two"); |
| push(@array,"three"); |
#此時@array=〈"one","two","three"); |
指令:pop
語法:pop(@array)
說明:將數組@array的最一個元素刪除,並將刪除的元素返回。
范例:
| @array=〈"one"'"two"); |
| $rm=pop〈@array); |
#此時@array=("one");而$rm="two"; |
指令:unshift
語法:unshift(@array,$string)
說明:在數組@array的第一個元素前附加新的元素$string到數組@array中。
范例:
| @array=("one","two"); |
| unshift(@array'"three"); |
#此時@array=("three","one","two"); |
指令:shift
語法:shift(@array)
說明:將數組@array的第一個元素刪除,並將刪除的元素返回。
范例:
| @array=("one","two"); |
| $rm=shift(@array); |
#此時@array=("two"),而$rm="one"; |
、指令:join
語法:join($string,@array)
說明:在一數組@array的元素之間加上一指定的字符$string,並將結果返回。
范例:
| @array=("one","two","three"); |
| $total=join(":",@array); |
#此時$total="one:two:three"; |
指令:grep
語法:grep(/pattern/,@array)
說明:將符合文字處理模式(regular expression)的數組元素找出來。
范例:
| @array=("one","on","in"); |
| $count=grep(/on/,@array); |
#此時$count=2;(代表有二個元素符合) |
| @result=grep(/on/,@array); |
#此時@result=("one","on"); |
指令:hex
語法:hex($string)
說明:將十六進制的數值轉成十進制。
范例:
| $decimal=hex("ff"); |
#此時$decimal=255; |
指令:rand
語法:rand($interger)
說明:常和函數srand搭配來取得一隨機數,如果沒有事先宣告stand函數的話,則取出的數值是一個固定值。這個語法會返回一個介0和$interger之間的數值,如果$interger省略的話,則會返回一個介0和1的數值。
范例:
| srand; |
#要先宣告srand函數,才能產生隨機數的效果 |
| $int=rand(10); |
#$int的值會大0而且小10 |
| 如果希望產生的亂數是整數的話,就要再
加上int這個函數 |
| $int=int(rand(10)); |
#$int的值是一個整數,且值在0和9之間 |
指令:localtime
語法:localtime(time)
說明:可返回九個有關時間的元素,在寫CGI應用程序的時候常會用到系統的時間,所以在此會詳細介紹這個函數的用法。
范例:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
其中:
| $sec |
代表秒數[0,59] |
$min |
代表分數[0,59] |
| $hour |
代表小時數[0,23] |
$mday |
代表是在這個月的第幾天[1,31] |
| $mon |
代表月數[0,11],要將$mon加l之,才能
符合實際情況 |
| $year |
從l990年算起的年數 |
| $wday |
從星期六算起,代表是在這周中的第幾天
[0,6] |
| $yday |
從一月一日算起,代表是在這年中的第幾
天[0,365] |
| $isdst |
只是一個flag |
| 知道這些變量之,就可以在CGI應用程序中拿來應用了。此外,也可以用下面這一行指令在Unix系統下取得系統的時間。為了避免錯誤發生,最好用絕對路徑的方法來取得系統時間,如果絕對路徑不清楚的話可以用“which
date”,這個指令來得知。最要提醒讀者的是要用`這個符號才能執行Unix系統的外部程序,如果是用‘(單引號)這個字符號的話,就不能正確執行系統的程序了。 |
$date=`/usr/bin/date`;
而在perl5版本中,也可以用下面這一行指令來取得系統時間。
$date=localtime(time);
指令:die
語法:die LIST
說明:會把LIST字符串顯示出來,並退出程序。常常和$!這個代表錯誤信息的變量一起使用。
范例:
Open(FILE'"$filename")||die"Cannotopenfile$!\n";
如果打開文件失敗的話,就會顯示出錯誤的信息,之再退出程序。
指令:open
語法:open(Filehandle'"$fiiename")
其中$filename是一個指定打開的文件名。
說明:這是一個很常用的函數,可用文件的打開(Read0niy)。在CGI程序設計中常常會打開一個文件來讀取數據,所以筆者會詳加說明這一個函數的相關用法。這個Filehandle可把它看作在I(Inpnt)/O(Output)間的一個橋樑,可以利用Filehandle來作出數據讀入寫出的動作。開始可用open這個函數來打開一個指定的文件,接下來可以使用<Filehandle>來讀取所打開文件的數據內容,最一定要用close這個函數來關閉這個之前打開的Filehandle。要注意的是在CGI程序寫作中,當用open這個函數來打開文件的時候,一定要在打開的文件前加上文件所在的絕對路徑名稱。
范例:
$filename=Vpath/cgi.txt";
open(FILE'"$filename")||die"Can not open $filename\n";
#將數據指派給純量變量$line(一行一行地)
while($line=<FILE>){
print"$line";
}
close(FILE);
就會把cgi.txt這個文件的內容顯示出來。
語法二:open(Filehandle,"<$filename")
說明:這個語法也可以打開一個存在的文件(Read Only)。
范例:
$filename="/path/cgi.txt";
open(FILE,"<$filename")||die"Can not open $filename\n";
#將<FILE>全部的數據內容都指派給數組@array
@array=<FILE>;
close(FILE);
print"@array";
也會把cgi.txt這個文件的內容顯示出來。
語法三:open(Filehandle,">$filemme)
說明:建立一個新的文件(Write Only),如果已經存在這個文件了,就會把舊文件名覆蓋過去。並可用print Filehandle的方式將數據寫到所打開的文件中。
范例:
$filename="/path/cgi.txt";
open(FILE,">$filename")||die"Can not open $filename\n";
print FILE"this is a new line1\n"; #\n是換行字符
print FILE"this is a new line2\n";
close(FILE);
會把數據存在一個新文件中。
語法四:Open(Filehandle,">>$filename")
說明:數據用附加的方式寫入一文件(Write Only),如果指定的文件名不存在的話,就會建立一個新的文件。
范例:
$filename="/path/cgi.txt";
open(FILE,">>$filename")||die"Can not open $filename\n";
print FILE"this is a newline1\n";
print FILE"this is a newline2\n";
close(FILE);
會把數據附加(append)到一個文件(cgi.txt)中。
語法五:Open(Filehandle,"|Unix Command")
說明:就會把在Fiiehandle的數據輸出給Unix的指令來作處理。
范例:
$mailprog="/usr/ucb/mail"; #Unix系統上的寄信程序(要加絕對路徑哦!)
$who="jcjung@tem.nctu.edu.tw";
open(FILE,"|$mailprog$who")||die"CannotFail!\n";
print FILE"想不想我呀?\n";
print FILE"要快一點回信哦!\n";
close(FILE);
就會通過Unix系統mail的程序,將FILE這個Filehandle的數據內容寄給$who這個變量所指定的收信人。我們可以利用open這個函數來設計一個來信批評指教的CGl應用程序,在本書中的下一章中會有詳細的介紹。
指令:close
用法:close(Filehandle)
說明:用open這個函數來打開一個filehandle之,一定要用close這個函數把所打開的Filehandle關閉。
范例:
open(Fiiehandle,"$filename");
close(Filehandle);
指令:pack
語法:pack("指定的格式",LIST)
說明:pack這個函數會將一個LIST變成所指定的二進制數據格式。在CGI程序分割解碼過程中,會用到pack這個函數,所以筆者在此簡單介紹這個函數的用法。
范例:
$string=pack("C",65); #此時$string="A";
將65這個ASCII碼轉換成一個unsigned字符,其中C就是指定要轉換成unsigned字符的意思。
指令:read
語法:read(Filehandle,$string,length)
其中length是代表讀入字符串的長度(bytes)。 說明:用read這個函數把Filehand1e中的數據依指定的字符串長度讀入之指派給$string這個變量。在CGI程序分割解碼過程中,如果FORM的傳送方式是設定為POST的話,就會將傳送的數據設定為標準輸入,所以會將數據內容指定給STDIN這個標準輸入的Filehandle,而CGI環境變量$ENV{'CONTENT_LENGTH'}就是代表使用者送出數據內容的長度,因此我們要用read這個函數來取得使用者送出的數據內容。
范例:
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
就會將STDIN這個標準輸入Filehandle中的數據依指定的字符串長度讀入,再指派給$buffer這個變量。
指令:exit
語法:exit
說明:退出執行的程序。
范例:
print"i love perl";
exit;
顯示出“i love perl"之,就馬上退出這個程序。
6.3.3 Perl語言的運算符號字符
以下是在Perl語言中常用的運算字符,大部分和C語言中的運算字符很類似,學過C語言的人應該會對這些運算字符十分熟悉才對。
一、賦值(Assignment)運算符
| 符號 |
范例 |
說明 |
| = |
$x=$y; |
將$y的值指派給$x |
| += |
$x+=$y; |
$x=$x+$y;將$x加$y之再指派給$x |
| -= |
$x-=$y; |
$x=$x-$y;將$x減$y之再指派給$x |
| *= |
$x*=$y; |
$x=$x*$y;將$x乘$y之再指派給$x |
| /= |
$x/=$y; |
$x=$x/$y;求出$x除以$y之的商數,再指派給$x |
| **= |
$x**=$y; |
$x=$x**$y;將$x乘上$y次方之再指派給$x |
| %= |
$x%=$y |
$x=$x%$y;求出$x除以$y的余數之,再指派給$x |
| .= |
$str1.=$str2; |
$str1=$str1.$str2;
將$str1這個字符串再加上$str2這個字符串之,再指派給$str1這個字符串 |
| x= |
$str x=$y |
$str=$str x $y
重復$str字符串$y次並把結果指派給$str這個字符串 |
二、算術(Arithmetic)運算符
| 符號 |
范例 |
說明 |
| + |
$z=$x+$y |
將$x和$y相加之,再將結果指派給$z |
| - |
$z=$x-$y |
將$x減掉$y之,再將結果指派給$z |
| * |
$z=$x*$y |
將$x和$y相乘之,再將結果指派給$z |
| / |
$z=$x/$y |
將$x除以$y之,再將商數指派給$z |
| % |
$z=$x%$y |
將$x除以$y之,再將余數指派給$z |
| ** |
$z=$x**$y |
將$x乘以$y次方之,再將結果指派給$z |
| ++ |
$x++;++$x |
如同$x=$x+1,將$x加一以再將結果指派給$x |
| -- |
$x--;--$x |
如同$x=$x-1,將$x減一以再將結果指派給$x |
| . |
$z=$x.$y |
將$x字符串和$y字符串連接之,再將結果指派給$z |
三、數值(Numeric Values)關系運算符
| 符號 |
范例 |
說明 |
| > |
$x>$y |
如果$x大$y,返回1的值,否則返回0 |
| >= |
$x>=$y |
如果$x大等$y,返回1的值,否則返回0 |
| < |
$x<$y |
如果$x小$y,返回l的值,否則返回0 |
| <= |
$x<=$y |
如果$x小等$y,返回1的值,否則返回0 |
| == |
$x==$y |
如果$x等$y,返回l的值,否則返回0 |
| != |
$x!=$y |
如果$x不等$y,返回1的值,否則返回0 |
| <=> |
$x<=>$y |
如果$x大$y,返回1的值;如果$x等$y,返回0;如果$x小$y,則返回-1的值 |
四、字符串(StringValues)關系運算符
| 符號 |
范例 |
說明 |
| gt |
$str1 gt $str2 |
如果$str1大$str2,返回1的值,否則返回0 |
| ge |
$str1 ge $str2 |
如果$str1大等$str2,返回1的值,否則返回0 |
| lt |
$str1 lt $str2 |
如果$str1小$str2,返回1的值,否則返回0 |
| le |
$strl le $str2 |
如果$strl小等$str2,返回1的值,否則返回0 |
| eq |
$strl eq $str2 |
如果$strl等$str2,返回1的值,否則返回0 |
| ne |
$str1 ne $str2 |
如果$strl不等$str2,返回1的值,否則返回0 |
| cmp |
$str1 cmp $str2 |
如果$str1大$str2,返回1的值;如果$str1等$str2,返回0;如果$str1小$str2,則返回-1的值 |
五、邏輯(Logical)運算符
1.$x && $y(And)
| $x |
$y |
結果 |
| 真(True) |
真(True) |
真(True) |
| 真(True) |
假(False) |
假(False) |
| 假(False) |
真(True) |
假(False) |
| 假(False) |
假(False) |
假(False) |
2.$x||$y(Or)
| $x |
$y |
結果 |
| 真(True) |
真(True) |
真(True) |
| 真(True) |
假(False) |
真(True) |
| 假(False) |
真(True) |
真(True) |
| 假(False) |
假(False) |
假(False) |
3.!$x(Not)
| $x |
結果 |
| 真(True) |
假(False) |
| 假(False) |
真(True) |
六、其他常用的運算符
指令:..區塊運算符(Range Operator)
說明:這個運算符是Perl語言中特有的運算符,是一個很實用的運算符。
范例:
@digits=(1..9); #此時@digits=(l,2,3,4,5,6,7,8,9);
@digits=('10'..'05'); #此時@digits=(01,02,03,04,05);
@char=('A'..'E'); #此時@char=('A','B','C','D','E');
@total=(l..3,'A'..'B');#此時@total=(1,2,3,'A','B');
指令:判別運算式?運算式1:運算式2 條件運算符(Conditional
Operator)
說明:這個語法的意義和C語言一樣,如果判別運算式的值是真(True)的話,則做運算1的
運算,如果判別運算式是假(False)的話,則做運算式2的運算。
范例:
$price=($age>60)?100:200;
如果$age大60的話,則$price等100;否則$price等200.
七、常用的文件數據(File test)運算符
| 范例 |
說明 |
| -r $file |
如果$file是可讀取的話,返回1的值 |
| -w $file |
如果$file是可寫入的話,返回1的值 |
| -x $file |
如果$file是可執行的話,返回1的值 |
| -e $file |
如果$file存在的話,返回1的值 |
| -o $file |
如果$file是被執行者所擁有的話,返回1的值 |
| -s $file |
返回$file的文件大小(bytes) |
| -f $file |
如果$file是正常文件的話,返回1的 值 |
| -T $file |
如果$file是文本文件的話,返回1的值 |
| -B $file |
如果$file是Billry文件的話,返回1的值 |
| -M $file |
返回$file文件最一次更改時間到現在的日期數 |
6.3.4 Perl語言的流程控制
以下是在Perl語言中常用的程序流程控制,大部分和C語言的程序流程控制很類似,學
過C語言的人,應該會很熟悉。
一、選擇性流程控制
指令:if假如
語法一:if(判別運算式){
程序敘述區塊;
}
上個語法在Perl中也可以寫成:
程序敘述區塊if(判別運算式);
范例:
print"請輸入您的分數?\n";
$score=<STDIN>; #<STDIN>代表標準輸入,會讓使用者輸入一字符串
chop($score); #將$score最一個換行字符\n刪除掉
if($score>=60){
print"您的分數及格了!\n";
也可以寫成:
print"您的分數及格了!\n"if($score>=60);
語法二:if(判別運算式一){
程序敘述區塊一;
}else{
程序敘述區塊二;
}
范例:
print"請輸入您的分數?\n";
$score=<STDIN>;
chop($score);
if($score>=60){
print"您的分數及格了!\n"
}else{
print"您的分數不及格!\n";
}
語法三:if(判別運算式一){
程序敘述區塊一;
}elsif(判別運算式二){
程序敘述區塊二;
}else{
程序敘述區塊三;
}
范例:
print"請輸入您的分數?\n";
$score=<STDIN>;
chop($score);
if($score>60){
print"您的分數大60分!\n";
}elsif($score$
(http://www.fanqiang.com)
進入【UNIX論壇】
|