top
Loading...
Perl在CGI程序設計中常用的函數和指令
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
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,并會輸出$_這個內定輸出變量的數據內容。如果$_變量是一個空字符串的話,就會顯示出一個空字符串。
范例:
$_="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)
說明:把最后一個字符刪除掉,常常用這個函數把換行的字符(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"之后,就馬上退出這個程序。 
北斗有巢氏 有巢氏北斗