指令:#
說明:註解符號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
07 十進位ASCII碼
xff 十六進位碼
c[ 控制字元
範例:
print STDOUT"i love perln";
將“i love perl"再加上換行顯示於螢幕上。
-------------------------------------------------------------------------
文法二:Print LIST
說明:如果省略Filehandle的話,就會把Filehandle內定為STDOUT。也就是會將LIST的資料內容顯示於螢幕上。
範例:
$Str1ng="perl";
print"i love $stringn";
會將“i love perl”再加上換行顯示在螢幕上,而如果要讓雙引號內的變數失效的話,可以在變數前面加上這個符號。例如如果是print“i love $string”;的話,就會顯示出“i love $string”這個字串。
-------------------------------------------------------------------------
文法三:print
說明:同時省略Filehandle和LIST的話,就會以STDOUT為Filehandle,並會輸出$_這個內定輸出變數的資料內容。如果$_變數是一個Null 字元串的話,就會顯示出一個Null 字元串。
範例:
$_="i love perln";
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)
說明:把最後一個字元刪除掉,常常用這個函數把換行的字?br> ?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 $filenamen";
#將<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 $filenamen";
print FILE"this is a new line1n"; #n是換行字元
print FILE"this is a new line2n";
close(FILE);
會把資料存在一個新檔案中。
-------------------------------------------------------------------------
文法四:Open(Filehandle,">>$filename")
說明:資料用附加的方式寫入一檔案(Write Only),如果指定的檔案名稱不存在的話,就會建立一個新的檔案。
範例:
$filename="/path/cgi.txt";
open(FILE,">>$filename")||die"Can not open $filenamen";
print FILE"this is a newline1n";
print FILE"this is a newline2n";
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"之後,就馬上退出這個程式。