《国立中央大学电算中心陈庆彦.ppt》由会员分享,可在线阅读,更多相关《国立中央大学电算中心陈庆彦.ppt(71页珍藏版)》请在三一办公上搜索。
1、2023/9/4,國立中央大學電算中心 陳慶彥,1,CGI程式設計(for UNIX Perl),2023/9/4,國立中央大學電算中心 陳慶彥,2,主題,CGI 及其環境簡介 Perl 程式設計應用系統實作 公佈欄,2023/9/4,國立中央大學電算中心 陳慶彥,3,CGI 及其環境簡介,Internet,後端資料庫,CGI程式,前端瀏覽器,2023/9/4,國立中央大學電算中心 陳慶彥,4,CGI 及其環境簡介(cont),為什麼我的 HTML page/form 需要用 script因為有的時候您需要在 HTML 文件中使用動態資料(非固定不變的資料)CGI 各代表什麼?Common 向
2、您確保 CGI 可以使用多種程式語言並和多種 不同的系統互動Gateway 提示您 CGI 的力量不在於它本身所做的事,而 在於它提供了連結其他系統的潛力Interface 只是表示 CGI 對如何善用其特性提供了明確的 界定換句話說,您可以設計程式來適當利用這 個介面。,2023/9/4,國立中央大學電算中心 陳慶彥,5,CGI 及其環境簡介(cont),CGI程式相關的環境變數,2023/9/4,國立中央大學電算中心 陳慶彥,6,CGI 及其環境簡介(cont),Perl是什麼東西呢?它是Practical Extraction Report Language等字的縮寫,是一種能掃視任意文
3、字檔,並且能從中取出資訊製成報表的解譯語言(Interpreter)。Perl的作者Larry Wall說過一句話:Perl是懶人用的工具。如果Perl不是比其它語言更好更簡單更容易上手,恐怕很少人願意去學習新的程式語言。,2023/9/4,國立中央大學電算中心 陳慶彥,7,CGI 及其環境簡介(cont),Perl的特性Perl有非常傑出的文字處理能力,能輕易地產生HTML文件,尤其它具有完整的Regular Expression語法,使得在C語言看來必需要寫一大串程式碼的功能,Perl幾行就解決了。Perl是一種直譯式語言,因此可以避免在各種不同系統上,還需要重新編譯的麻煩。Perl的檢查
4、旗標(-T)可以保護你的Web Server,避免被未經授權的client破壞。,2023/9/4,國立中央大學電算中心 陳慶彥,8,CGI 及其環境簡介(cont),哪些平台上有 Perl?要到哪裡去找?,這套原始碼完全不需任何移植工作便可輕易地在絕大多數的 Unix系統(Perl的原生系統),以及 Plan 9、VMS、QNX、OS/2,和 Amiga上編譯安裝完成。適合 32 位元的微軟系統和蘋果系統、以執行檔形式發行的 Perl各可在 http:/,2023/9/4,國立中央大學電算中心 陳慶彥,9,CGI 及其環境簡介(cont),Perl的相關資料要上哪兒找?,man perl p
5、erldoc perl http:/,2023/9/4,國立中央大學電算中心 陳慶彥,10,Perl程式設計-執行環境,server 通常是設定成去執行放在 cgi-bin 目錄底下的 CGI 程式。不過,server 管理者同時也可以在設定檔中設定 aliases,讓所有含某些副檔名(如.cgi、.pl)的 scripts 都能執行 AllowOverride None Options ExecCGI Options Indexes Includes ExecCGI AllowOverride None order allow,deny 什麼是檔案使用權限?怎樣改?,2023/9/4,國立中
6、央大學電算中心 陳慶彥,11,Perl程式設計-Lab 1.您的第一個程式,選擇編輯器 vi,joe,ee,pe2或是在client端將編輯好了的檔案上傳到server您的第一個程式hello.cgi#!/usr/bin/perl print“hello world!n”;Chmod 755 hello.cgi執行hello.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,12,Perl程式設計-資料型態,Scalar:純量變數是Perl裡最基本的一種資料型態,它可以代表一個字元、字串、整數、甚至浮點數,而Perl把它們都看成是一樣的!Scalar Array:純量陣列,陣列內的每一個
7、元素都是Scalar variableHash Array(Associative Array):雜湊陣列也叫做相關陣列,它和一般陣列沒什麼不同,差別只是在它的索引值用的是字串,而非一般陣列所用的整數值References(Pointer):Perl 5新增了參考指標的資料型態使Perl和C一樣可借由指標建立一些複雜的資料結構。,2023/9/4,國立中央大學電算中心 陳慶彥,13,Perl程式設計-資料型態(cont),Scalar:字串運算子,2023/9/4,國立中央大學電算中心 陳慶彥,14,Perl程式設計-資料型態(cont),Scalar:字串運算子,2023/9/4,國立中央大
8、學電算中心 陳慶彥,15,Perl程式設計-資料型態(cont),Scalar:數值運算子,2023/9/4,國立中央大學電算中心 陳慶彥,16,Perl程式設計-資料型態(cont),Scalar:數值運算子,2023/9/4,國立中央大學電算中心 陳慶彥,17,Perl程式設計-資料型態(cont),Scalar:數值運算子,2023/9/4,國立中央大學電算中心 陳慶彥,18,Perl程式設計-資料型態(cont)-Lab 2,Lab2.Stg1.cgi#!/usr/bin/perl$name=Eric C.Herrmann;print The owner of this program
9、 is$namen;$firstName=Eric;$middleInitial=C.;$lastName=Herrmann;print The owner of this program is$firstName$middleInitial;print$lastNamen;$fName=Eric;$mInitial=C.;$lName=Herrmann;print The owner of this program is$fName$mInitial$lNamen;,2023/9/4,國立中央大學電算中心 陳慶彥,19,Perl程式設計-資料型態(cont),2023/9/4,國立中央大學電
10、算中心 陳慶彥,20,Perl程式設計-資料型態(cont)-Lab 3,Lab3.value1.cgi#!/usr/bin/perl$integerValue=10;$floatingPointValue=11.43;$scientificValue=42.03E-04;$nationalDebt=6_000_000_000_000;$divisionValue=23/7;$hexValue=0 x0F3;$octalValue=037;$itotal=$integerValue+$hexValue;$ftotal=$floatingPointValue+$integerValue;$dto
11、tal=$divisionValue+$octalValue;,print Integer t$integerValuen;print Floating Point t”;Print“$floatingPointValuen;print Scientific t$scientificValuen;print National Debt t$nationalDebtn;print Division t$divisionValuen;print Hex tt$hexValuen;print Octal tt$octalValuen;print nn;print itotal=$itotaln;pr
12、int ftotal=$ftotaln;print dtotal=$dtotaln;,2023/9/4,國立中央大學電算中心 陳慶彥,21,Perl程式設計-資料型態-Lab 3(cont),2023/9/4,國立中央大學電算中心 陳慶彥,22,Perl程式設計-資料型態(cont),Scalar Array:,純量陣列,陣列內的每一個元素都是Scalar variable。宣告及使用方式如下:#純量陣列以 開頭。my array;my array=qw(a b c d);#qw 函數會將其後的每個元素用逗點隔開,效果就像下面這行。my array=(a,b,c,d);,2023/9/4,國立
13、中央大學電算中心 陳慶彥,23,Perl程式設計-資料型態(cont),Scalar Array:,#當然你也可以一個個元素宣告,下面就是存取每一個元素的方法。#因為陣列中的每一個元素都是純量變數,所以要以$開頭,#剛開始容易搞混,請注意。$array0=a;$array1=b;$array2=c;$array3=d;#使用for loop印出陣列內每個元素的值。for($i=0;$i=$#array;$i+)print$array$in;,2023/9/4,國立中央大學電算中心 陳慶彥,24,Perl程式設計-資料型態(cont)-Lab4,Lab 4 scalearray1.cgi#!/u
14、sr/bin/perl FamilyName=(Steven,Michael,Herrmann);print$FamilyName0;print$FamilyName1;print$FamilyName2;print nn;print$FamilyName0$FamilyName1$FamilyName2n;,2023/9/4,國立中央大學電算中心 陳慶彥,25,Perl程式設計-資料型態(cont)-Lab5,Lab 5 scalearray2.cgi(Mixed Data Assigned to Array Cells),#!/usr/bin/perl$cellIndex=0;$mixed
15、Data$cellIndex=mixedData;$mixedData2=876;$mixedData6=The last cell;$mixedData4=3.41467;foreach$value(mixedData),print Cell number$cellIndex=$value n;$cellIndex+;print nn;print The last cell of the array mixedData is$#mixedData;print nn;,2023/9/4,國立中央大學電算中心 陳慶彥,26,Perl程式設計-資料型態-Lab5(cont),2023/9/4,國立
16、中央大學電算中心 陳慶彥,27,Perl程式設計-資料型態(cont),Hash Array(Associative Array),#相關陣列是以%符號開頭的。my%hash;my%hash=(i1=aaa,i2=bbb,i3=ccc);$hashi1=aaa;$hashi2=bbb;$hashi3=ccc;,2023/9/4,國立中央大學電算中心 陳慶彥,28,Perl程式設計-資料型態(cont)-Lab6,#!/usr/bin/perlprint nn;%priceList=(Hackamore=28.92,English Bridle=36.31,Western Saddle=124.
17、00,Hunt Seat Saddle=178.01,Jumping Saddle=205.87,Leather Halter=24.56,);,printAA(%priceList);print You could print a hash cell like this$priceListWestern Saddlen;%priceList=(1358=28.92,1359=36.31,1965=124.00,1966=178.01,1977=205.87,1357=24.56,);,Lab 6 hasharray.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,29,Perl程式設
18、計-資料型態-Lab6(cont),print Or like this$priceList1965 nn;printAA(%priceList);sub printAA my%myPriceList=_;foreach$key(keys(%myPriceList)print The price of item$key is$priceList$keyn;print nn;,Lab 6 hasharray.cgi(cont),2023/9/4,國立中央大學電算中心 陳慶彥,30,Perl程式設計-資料型態-Lab6(cont),2023/9/4,國立中央大學電算中心 陳慶彥,31,Perl程式
19、設計-資料型態(cont),References(Pointer),如何取得變數的位址?$scalarRef=$scalarVar;$arrayRef=arrayVar;$hashRef=%hashVar;$funcRef=,2023/9/4,國立中央大學電算中心 陳慶彥,32,Perl程式設計-資料型態(cont),References(Pointer),如何使用指標?print$scalarRef;print$arrayRef;print$hashRef-$key;,2023/9/4,國立中央大學電算中心 陳慶彥,33,Perl程式設計-資料型態(cont)-Lab7,#!/usr/bin
20、/perl$hashRef=a=aa,b=bb,c=cc;print$hashRef-at$hashRef-bt$hashRef-cn;my%hashRef1=(a=aa,b=bb,c=cc);print$hashRef1at$hashRef1bt$hashRef1cn;,Lab 7 pointer.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,34,Perl程式設計-控制敘述,條件控制敘述(Conditional Control Statements),if(Expression)Code Segment if(Expression)Code Segment else Code S
21、egment statement if(Expression);statement unless(Expression);,2023/9/4,國立中央大學電算中心 陳慶彥,35,Perl程式設計-迴圈控制敘述,迴圈控制敘述(Loop Control Statements),for($i=0;$i=10;$i+)Code Segmentforeach$i(array)Code Segmentfor$i(0.10)Code Segmentwhile($i=10)Code Segmentdo Code Segment while(Expression);,2023/9/4,國立中央大學電算中心 陳慶
22、彥,36,Perl程式設計-控制敘述-Lab8,#!/usr/bin/perlmy custom;$custom0=張三;$custom1=李四;$custom2=王五;for($i=0;$i=$#custom;$i+)if($custom$i eq 李四)print 我是李四n;,$cnt=0;while($cnt=$#custom)print 我是$custom$cntt;$cnt+;print“n”;#第一個引數是純量變數,第二個引數要用#括號括起來,裡面是一個純量陣列,顧名#思義它就是把陣列中的每個元素依序傳給#第一個引數,直到全部傳完。foreach$i(custom)print 我
23、是$it;,Lab 8 if.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,37,Syntax:sub NAME Code呼叫副程式:&NAME(para1,para2,.)參數傳遞:_,Perl程式設計-副程式(Subroutines),2023/9/4,國立中央大學電算中心 陳慶彥,38,Perl程式設計-副程式(Subroutines),2023/9/4,國立中央大學電算中心 陳慶彥,39,Syntax:open(FILEHANDLE,Expression);可以開啟一個以 string 指定檔名的檔案,並傳回檔案代碼給 filehead 這個函式,如果執行程功的話,會傳回tr
24、ue,否則就傳回 undef.如果開頭字元為,就會以寫入模式開啟 如果開頭字元是以,就會以新增模式開啟 如果開頭字元為+(例:+,+)開啟的檔案會可讀又可寫 close(FILEHANDLE);,Perl程式設計-I/O和檔案處理,2023/9/4,國立中央大學電算中心 陳慶彥,40,Perl程式設計-I/O和檔案處理-Lab9,#!/usr/bin/perl$FileName=test.txt;open(WFILE,$FileName);print WFILE 123n;print WFILE 456n;print WFILE 789n;close(WFILE);#讀取test.txt內容$
25、FileName=test.txt;my MyDept;,open(FILE,$FileName)|die$!;LINES=;close(FILE);$SIZE=LINES;for($i=0;$i$SIZE;$i+)$MyDept$i=$LINES$i;print$MyDept$i;,Lab 9 file.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,41,Perl程式設計-控制字元,2023/9/4,國立中央大學電算中心 陳慶彥,42,Regular Expression通常是用來尋找特定的字串樣式(pattern),也就是所謂格式辨認(pattern-matching)的功能。它
26、的運算子是=和!,可以把它念做match和not match。Syntax:$string=/regular expression/expression modifier 例:$sentence=/Hello/,Perl程式設計-Regular Expressions,2023/9/4,國立中央大學電算中心 陳慶彥,43,Perl程式設計-Regular Expressions,Modifiers:修飾選項可有可無,它是用來對整個敘述作修正的。,2023/9/4,國立中央大學電算中心 陳慶彥,44,Perl程式設計-Regular Expressions,Metacharacter:下面這些字
27、元都具有特殊意義,可以讓你建立更複雜的 搜尋樣式(searching pattern)。,2023/9/4,國立中央大學電算中心 陳慶彥,45,Perl程式設計-Regular Expressions,Pattern Quantifier:用來表示字元的數量關係。,2023/9/4,國立中央大學電算中心 陳慶彥,46,Perl程式設計-Regular Expressions,Character Patterns:下列的sequence用來match一些特定格式的字元,2023/9/4,國立中央大學電算中心 陳慶彥,47,/abc/找到含有abc的字串/abc/找到開頭是abc的字串/abc$/
28、找到結尾是abc的字串/a|b/找到有a或b的字串,也可以用來找整個字(word),Perl程式設計-Regular Expressions-Exam.,2023/9/4,國立中央大學電算中心 陳慶彥,48,/ab2,4c/找到a後面跟著2-4個b,再跟著c的字串,若只有/ab2,c/則會找二個以上的b/ab*c/找到a後面跟著0個或多個b,再跟著c的字串,如同/ab0,c/ab+c/找到a後面跟著一個以上的b,再跟著c的字串,如同/ab1,c/,Perl程式設計-Regular Expressions(cont),2023/9/4,國立中央大學電算中心 陳慶彥,49,/a.c/.可以代表任何
29、字元,除了new line字元(n)外。/abc/找到含有這三個字元中任何一個的字串/d/找到含有數字的字串,如同/0-9/w/找到含有字母的字串,如同/a-zA-Z0-9_/,Perl程式設計-Regular Expressions(cont),2023/9/4,國立中央大學電算中心 陳慶彥,50,/s/找到含有white space的字串,如同/trnf/abc/找到沒有abc任一字元的字串/*/找到含有字元*的字串,在反斜線後面的字元Perl會把它當作普通字元看待。若你不確定這個符號是否為特殊字元,乾脆全加上以策安全。/abc/i 忽略abc的大小寫,Perl程式設計-Regular E
30、xpressions(cont),2023/9/4,國立中央大學電算中心 陳慶彥,51,/(d+).(d+).(d+).(d+)/找到類似IP的字串,並將IP的四個數字分別存在$1,$2,$3,$4四個特殊變數中,以便在其後加以利用。例:if($x=/(d+.d+).d+.d+/)print“中央大學 if($1 eq 140.115);$x=s/s+/g把所有的white space全部去除掉$x=s/(*):*(*)/$2:$1/把用:分開的兩個欄位互相對調,Perl程式設計-Regular Expressions(cont),2023/9/4,國立中央大學電算中心 陳慶彥,52,$x=t
31、r/this/that/把this替換成that$x=tr/a-z/A-Z/把小寫字母全部替換成大寫字母$count=$x=tr/*/*/計算$x中有幾個*,Perl程式設計-Regular Expressions(cont),2023/9/4,國立中央大學電算中心 陳慶彥,53,Perl程式設計-Regular Expressions-Lab10,#!/usr/bin/perl$url=http:/ccy.dd.ncu.edu.tw:8080/cgi-bin/news.cgi;($host,$port,$file)=($url=m|http:/(/:+):0,1(d*)(S*)$|);pri
32、nt“處理的字串:$urln;print“處理後的主機名稱:$hostn;print 處理後的主機port:$portn;print“處理後的檔名:$filen;,Lab 10 regular1.cgi,2023/9/4,國立中央大學電算中心 陳慶彥,54,Perl程式設計-Regular Expressions-Lab10,$url=m|m命令可以讓你自訂pattern的分隔符號,m後面跟著的就是分隔符號,|是在字串中尋找多個pattern。(/:+)match一個字串,裡面沒有/和:字元。找到的字串存在$1中。:0,1(d*)match 0或1個:,後面跟著一串數字或nothing。找到的
33、字串存在$2中,若找不到,$2就是空的。(S*)$match一串非空白字元,並以找到的字串為結尾。找到的字串存在$3中。,2023/9/4,國立中央大學電算中心 陳慶彥,55,Perl程式設計-Regular Expressions-Lab10,(S*)$match一串非空白字元,並以找到的字串為結尾。找到的字串存在$3中。()=()($host,$port,$file)=($1,$2,$3)即$host=my.machine.tw$port=8080$file=/cgi-bin/test.pl,2023/9/4,國立中央大學電算中心 陳慶彥,56,Perl程式設計-利用Perl撰寫CGI程式
34、,HTTP headers(表頭)HTTP通訊協定是一種很簡單的client-server通訊協定,client和server之間的溝通由兩部分所組成,一是HTTP headers,另一就是文件或資料本身了,中間則以一個空白行隔開。,2023/9/4,國立中央大學電算中心 陳慶彥,57,Perl程式設計-利用Perl撰寫CGI程式,由於瀏覽器和HTTP server都有很多不同的版本,所使用的HTTP headers也各不相同,常用的HTTP headers有下列幾種:,2023/9/4,國立中央大學電算中心 陳慶彥,58,Perl程式設計-利用Perl撰寫CGI程式,這是一個由Netscap
35、e Navigator 3.0版所發出的request:GET/HTTP/1.0Connection:Keep-AliveUser-Agent:Mozilla/3.0(WinNT;I)Host:ind.ntou.edu.twAccept:image/gif,image/x-xbitmap,image/jpeg,*/*,2023/9/4,國立中央大學電算中心 陳慶彥,59,Perl程式設計-利用Perl撰寫CGI程式,HTTP/1.1 200 OKDate:Sat,06 Sep 1997 03:32:12 GMTServer:Apache/1.2b11Last-Modified:Mon,16 J
36、un 1997 14:03:10 GMTETag:b5496-ab0-33a5479eContent-Length:2736Accept-Ranges:bytesKeep-Alive:timeout=15,max=100Connection:Keep-AliveContent-Type:text/htmlWelcome to NTOU CC Email/WWW Server.,而ind的apache HTTP server的回應則是:,2023/9/4,國立中央大學電算中心 陳慶彥,60,Perl程式設計-利用Perl撰寫CGI程式,輸出網頁內容的步驟 先輸出 Content-type:tex
37、t/htmlnn 再輸出網頁的內容,2023/9/4,國立中央大學電算中心 陳慶彥,61,Perl程式設計-利用Perl撰寫CGI程式-Lab11,#!/usr/bin/perl PrintHeader();print;PrintENV();print;sub PrintHeader print Content-type:text/htmlnn;,sub PrintENV my$key;foreach$key(sort keys%ENV)print$key=$ENV$keyn;,2023/9/4,國立中央大學電算中心 陳慶彥,62,Perl程式設計-利用Perl撰寫CGI程式-Lab11,20
38、23/9/4,國立中央大學電算中心 陳慶彥,63,應用系統實作 公佈欄,2023/9/4,國立中央大學電算中心 陳慶彥,64,應用系統實作公佈欄-系統架構,2023/9/4,國立中央大學電算中心 陳慶彥,65,應用系統實作公佈欄-系統架構,執行News.cgi,ReadPara();,ReadDept();,ReadUser();,輸入“”,輸入“系統管理”,輸入“帳號管理”,輸入“張貼公告”,ReadNews();,SystemConfigForm();,AddUserForm();,PostNewsForm();,2023/9/4,國立中央大學電算中心 陳慶彥,66,應用系統實作公佈欄(c
39、ont),CGI 功 能 說 明CGI 是 Common Gateway Interface 的 簡 稱.其 主 要 的 功 能 是 在 WWW 環 境 下,藉 由 從 使 用 者 端傳 遞 一 些 訊 息 給 WWW 伺 服 軟 體,再 由 WWW 伺 服 軟 體去 啟 動 所 指 定 的 程 式 碼 來 完 成特 定 的 工 作.所 以 更 明 確 的 說,CGI 僅 是 在 WWW 主 機 端 上 的 可 執 行 的 程 式 碼.,2023/9/4,國立中央大學電算中心 陳慶彥,67,應用系統實作公佈欄-資料傳遞,2023/9/4,國立中央大學電算中心 陳慶彥,68,應用系統實作公佈欄-
40、Client傳送data,#副程式:系統登入 sub Login print_top();print;print;帳號:”;密碼:;print“”;print“;print;Print“;print_bottom();,2023/9/4,國立中央大學電算中心 陳慶彥,69,應用系統實作公佈欄-Server端接收data,ReadForm(*FORM);Print“$FORMlogin_name”;Print“$FORMlogin_password”;sub ReadForm local(*in)=_ if _;local($i,$key,$val);#Read in text if($ENVREQUEST_METHOD eq GET)$in=$ENVQUERY_STRING;elsif($ENVREQUEST_METHOD eq POST)read(STDIN,$in,$ENVCONTENT_LENGTH);if($ENVQUERY_STRING=/=/)$in=join(,in=split(/,2023/9/4,國立中央大學電算中心 陳慶彥,70,應用系統實作-公佈欄,程式碼講解(請參考附件),2023/9/4,國立中央大學電算中心 陳慶彥,71,測驗-檔名(exam.cgi),請利用perl設計一個可供使用者登入資料與顯示資料的CGI程式,