CGI程式設計(for UNIX Perl) 2018/11/20 CGI程式設計(for UNIX Perl) 2018/11/20 國立中央大學電算中心 陳慶彥
主題 CGI 及其環境簡介 Perl 程式設計 應用系統實作 – 公佈欄 2018/11/20 國立中央大學電算中心 陳慶彥 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介 後端 Internet 資料庫 CGI程式 前端瀏覽器 2018/11/20 國立中央大學電算中心 陳慶彥 原始的HTML語言是設計用來展現靜態的資料,它讓人使用一種簡單的語法展現出豐富的多媒體資料,就像廣告看板一樣。由於WWW具有相當大的商業用途,因此推出後大受歡迎。可是單純的靜態展示好像缺少了什麼? 如果使用者需要的資料具有時效性,必需時常更新,這時該怎麼辦呢? 又或者你想留下使用者的資料,讓你的網頁能跟使用者達到互動的效果,這時又該如何? 由於上述種種需求,於是就誕生了CGI這東東。 CGI是Common Gateway Interface的縮寫,中文翻做『共通閘道介面』。它是一種標準介面程式,能讓你的網頁跟WWW server溝通,達到跟使用者互動的效果。而且透過CGI程式,可以讓你動態的產生網頁,秀出server上的最新資料。當你link到一個CGI物件時,你取回的文件並非是一份靜態資料,而是一個藉由程式動態產生的HTML資料流。傳回來的資料也許分分秒秒都在更改,或者針對使用者的特殊查詢而有不同的反應,例如股票市場行情等等。簡單來說,CGI程式就是能夠動態產生WWW網頁,並讓一般使用者經由WWW取用現存在傳統資訊系統內的資料。 首先,你得認清一個事實:如果資料是天天更新,你絕對不可能寫一個很大的HTML文件包含所有的這些更新資料。萬一放在WWW上的資料是分分秒秒都在變動的,那麼利用程式自動根據資料產生HTML文件顯然是你唯一的選擇。第二,CGI程式可以根據使用者輸入的要求自動產生HTML格式的資料。因為輸入資料是由WWW server負責接收,並非CGI程式本身,故得找出一個有效率的方法,來做使用者輸入參數和產生HTML文件程式間的溝通工作。 CGI本身制訂的標準有提到可以藉由環境變數來達成這個目的,而且CGI程式也有能力取得現存在各類資料庫裡的資料。這就是為什麼我們稱之為Common Gateway Interface,因為CGI程式通常就像橋樑或閘道一般,溝通著非WWW系統和WWW server (這和下面所說的Web server、HTTP server是一樣的,都是指一個架有HTTPd的伺服器)。 舉個例子來說,你是某家證券公司的大老闆,你的公司裡已經有一個相當完善的資料庫,裝滿了過去所有的股票價格資料,現在你想經由WWW提供這些資料給你的顧客們做參考,但是你的資料庫系統根本就不懂HTTP這種格式,這時你就需要一個閘道程式,當作股票價格資料庫和HTTP server間的橋樑通道,於是CGI程式就誕生了。它可以取得HTTP使用者送來的查詢指令,轉換成現存資料庫可以了解的指令,用以取得資料後,再將資料轉換為HTML格式,最後再經由HTTP server傳回給使用者,秀在使用者的瀏覽器上。 根據上述這些要求,CGI程式的確可以用任何程式語言來撰寫,只要該語言具有讀寫檔案的能力且該資料檔可被存取即可。不過這也表示寫程式時需要注意安全性的問題,以免資料被使用者有意無意的破壞,否則到時候就真的欲哭無淚了。 CGI程式 前端瀏覽器 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) 為什麼我的 HTML page/form 需要用 script CGI 各代表什麼? 2018/11/20 CGI 及其環境簡介(cont) 為什麼我的 HTML page/form 需要用 script 因為有的時候您需要在 HTML 文件中使用動態資料(非固定不變的資料) CGI 各代表什麼? Common 向您確保 CGI 可以使用多種程式語言並和多種 不同的系統互動 Gateway 提示您 CGI 的力量不在於它本身所做的事,而 在於它提供了連結其他系統的潛力 Interface 只是表示 CGI 對如何善用其特性提供了明確的 界定-換句話說,您可以設計程式來適當利用這 個介面。 Q1.1: 為什麼我的 HTML page/form 需要用 script? 因為有的時候您需要在 HTML 文件中使用動態資料(非固定不變的資料)。這包括了日期和時間這類的簡單資料,或是一個顯示「您是第 xxx 位訪客」的計數器。但它也可能包括根據使用者輸入而得出的大餅圖/條統圖、資料庫搜尋產生的結果,或動畫等這類的東西。要做出像這樣的東西,您唯一的方法是使用 CGI scripts (儘管您也可以應用客戶端程式,如 Java 和 JavaScript 來達到這個目的,不過那又是完全不同的一回事!)。 Q1.2: CGI 各代表什麼? 以下是我的編輯* Andy Oram 和 Linda Mui (他們很棒!)所寫的一段非常好的描述: 【譯者】這是原文的第一作者 Shishir G. 指他所寫的 CGI Programming on the World Wide Web 一書的編輯。 Common 向您確保 CGI 可以使用多種程式語言並和多種 不同的系統互動。它讓您自由選擇達到目的的方 法,不把您綁死在單獨一種作法之下*。 Gateway 提示您 CGI 的力量不在於它本身所做的事,而 在於它提供了連結其他系統的潛力,例如資料庫 和圖形製造器。 Interface 只是表示 CGI 對如何善用其特性提供了明確的 界定-換句話說,您可以設計程式來適當利用這 個介面。 【譯者】似乎有影射 Java 之意。 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) CGI程式相關的環境變數 2018/11/20 國立中央大學電算中心 陳慶彥 2018/11/20 當使用者用瀏覽器link到一個CGI程式時,瀏覽器會透過HTTP這個通訊協定,送出一個請求(require)給遠端(remote)的Web server,Web server就會跑一個HTTPd process,這個process會去找指定的目錄下有沒有這個CGI程式,如果有的話HTTPd會啟動一個child process來跑這個CGI程式,也因此繼承了HTTPd所有的環境變數設定。這也就是說使用者所輸入的要求會經由HTTP通訊協定傳送到Web server的HTTPd,再經由環境變數或標準輸入裝置(STDIN)傳遞給CGI程式。CGI程式相關的環境變數列表如上 CGI程式接收到使用者的需求,經過一番處理,然後會將標準輸出(執行結果)傳送給HTTPd,再經由HTTP交給客戶端(client)的瀏覽器秀出來。所以CGI程式在標準輸出上的執行結果必須要符合HTML格式,而在文件的排版方面當然也要依HTML格式來寫,這一點要特別注意一下。 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) Perl是什麼東西呢? 2018/11/20 CGI 及其環境簡介(cont) Perl是什麼東西呢? 它是Practical Extraction Report Language等字的縮寫,是一種能掃視任意文字檔,並且能從中取出資訊製成報表的解譯語言(Interpreter)。 Perl的作者Larry Wall說過一句話:「Perl是懶人用的工具」。如果Perl不是比其它語言更好更簡單更容易上手,恐怕很少人願意去學習新的程式語言。 Perl是一個高階程式語言,由 Larry Wall和其他許多人所寫,融合了許多語言的特性。它主要是由無所不在的 C語言,其次由 sed、awk,UNIX shell 和至少十數種其他的工具和語言所演化而來。Perl對 process、檔案,和文字有很強的處理、變換能力,因此舉凡有關快速原型設計、系統工具、軟體工具、系統管理、資料庫連結、圖像程式設計、網路連結,和 WWW程式設計等之類的任務,都特別 適合用 Perl來做。這些特長不但使 Perl成為系統維護管理者和 CGI作者的寵兒,就連數學家、遺傳學家、新聞從業者,甚至企業管理者也都用 Perl,所以或許您也該用。 Perl自由開放的發行方式要歸功於發燒前的 Internet的傳統文化及其作者 Larry Wall。Perl是由使用者提供支援。現在 Perl的核心、標準程式庫、選擇性安裝的模組,以及您現在正在閱讀的使用說明都出自於義務者之手。詳情請見 perl原始碼發行版中所附的 README檔案底部的私人註記。 值得一提的是,核心發展小組(稱為 Perl Porters)的成員是一群高度熱情奉獻的人仕,全心投入發展出比您所能想像、用錢能買得到還要更好的免費軟體。您可經由 news://genetics.upenn.edu/perl.porters-gw/ 和 http://www.frii.com/~gnat/perl/porters/summary.html取得關於新近發展計畫 的情報。 儘管 GNU計畫將 Perl囊括在它的發行中,但是沒有叫「GNU Perl」這樣的東西。 Perl既非自由軟體基金會所創,亦非由其負責維護。Perl的發行條款同時也較 GNU軟體更來得開放。 如果您願意,您可以購買商業性的 Perl支援。但對大多數使用者來說,非正式性的支援通常已相當足夠。詳情請見「到哪裡可買到商業性的 Perl支援」一問的回 答。 perl4和 perl5各代表什麼? perl4 和 perl5 是對 Perl程式語言的兩個不同版本的非正式稱呼,因為說「perl5」要比說「第 5(.004)版的 Perl」要來得簡單。但是有些人誤將其會意為:perl5是一個單獨的語言;這是不正確的。perl5只不過是對第五個主要發行版本(1994年 10 月)常用的稱呼罷了。就像 perl4是指第四個主要發行(1991年 3 月),還有 perl1(1988年 1月)、perl2(1988年 6 月),以及 perl3(1989年 10 月)。 5.0的發行基本上是從零開始,所有程式碼完全重新寫過的版本。它已經被模組化、物件導向化、微調、精簡化,及效率化,以致程式碼幾乎已變得和原來的不相同了。儘管如此,使用介面大致上仍然相同,而且和先前的版本之間保持了很高的 一致性。 為了避免「perl5是什麼語言?」這類的混淆,有些人索性完全避免「perl5」,而單用「perl」來指稱最近的 perl版本。其實用不著這麼累就是了。 Perl程式應算是 program還是 script? 都無所謂。 按標準術語來講,program指已經由編譯程序編譯好、轉為機器碼,可多次執 行的程式;而 script則是每次執行時都必須透過一個解譯程式來解譯。然而,Perl程式嚴格說來,既非編譯 (compiled) ,亦非解譯式 (interpreted);因 Perl程式可轉譯成位元碼形式存在(可說是某種 Perl虛擬機器 [virtual machine]),或轉譯為完全不同的語言,如 C或組合語言。所以光看原始碼很難 說它到底是替純解譯器、或是 parse-tree解譯器、位元碼解譯器,還是純碼編譯器而寫;因此這題很難給它一個確切的答案。 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) Perl的特性 2018/11/20 CGI 及其環境簡介(cont) Perl的特性 ⊙Perl有非常傑出的文字處理能力,能輕易地產生HTML文件,尤其它具有完整的Regular Expression語法,使得在C語言看來必需要寫一大串程式碼的功能,Perl幾行就解決了。 ⊙Perl是一種直譯式語言,因此可以避免在各種不同系統上,還需要重新編譯的麻煩。 ⊙Perl的檢查旗標(-T)可以保護你的Web Server,避免被未經授權的client破壞。 一個語言的好壞,我想我們可以從三個方向來看:資料型態(data type)、流程控制敘述(control statements)、特殊功能。 1.Perl的資料型態跟C語言和Pascal不大一樣,但它也支援指標(pointer,Perl5以後才支援),所以也可以和C語言一樣組合出很複雜的資料結構(data structure)。特別的是Perl有一種新的data type:相關陣列,它和一般陣列沒什麼不同,差別只在它的索引值是用字串,而非一般常用的整數值,因此相關陣列不像一般陣列一樣有次序的概念,它沒有所謂的第一項資料這種說法。我個人認為如果能善用這種data type會帶給你意想不到的收獲哦。 2.Perl的條件控制敘述(conditional control statements)與迴圈控制敘述(loop control statements)幾乎和C語言一模一樣,甚至語法和一些常用的指令也和C語言很類似,這對一般使用者而言是很方便的,可以很快的讓使用者進入狀況,進一步了解Perl的精華。而在Perl5中又引進了模組化和區域變數(local variables)的觀念,大大的增強了Perl的能力,使Perl幾乎變得無所不能。 3.Perl處理字串的能力是眾所皆知的,除了它的純量變數(scalar variable)可以很輕易的存取字串,特別的是Perl提供和UNIX很相近的Regular Expressions語法,這種格式辨認(pattern-matching)的語法很複雜但十分強大,大大地增強了Perl處理字串的能力,要善用Perl處理字串的能力,就得先對Regular Expressions痛下一番功夫不可。這個東東實在不好懂,不過只要你用上了手,真的是如虎添翼,每次使用時都會為它強大的功能竊喜,反而覺得C平淡無奇。另外Perl有一堆特殊的全域變數(global variables),用來設定程式的執行環境和其他細節,可能小到陣列索引的起始值,大到輸出欄位的分隔符號都有影響。這麼多的特殊變數對大多數的人而言是只是個困擾,但是我建議若要深入了解Perl、善用Perl,最好多了解這些特殊變數的意義。 說了這麼多Perl的優點,其實Perl也是有缺點的,最令人垢病的就是執行速度。由於Perl是直譯式的程式語言(Interpreter),不需要事先經過編譯(compile),這一點在發展程式初期很有用,程式寫好了就可以直接run了,但缺點是程式執行的速度會變慢,不利於發展大程式或系統程式。不過Perl對上述一般解譯語言的缺點做了一點改良,它在執行時會先載入整個程式碼,並執行初步的compile,包括語法檢查和建立符號表,因此Perl比一般script語言安全而且快多了。但是就我觀察所得,Perl有一些設計實在很浪費記憶體和CPU,似乎Perl並不很在意記憶體和速度,而是以實用性和方便性為優先考量。其實由於硬體技術的進步,對現在來說,記憶體和CPU速度已經不是那麼令人在意,反而程式的安全性和親和性才是考慮的重點,像Microsoft WORD這隻大怪獸一樣,所以對速度要求比較多的玩家,也只有請你多多忍耐了。 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) 哪些平台上有 Perl?要到哪裡去找? 2018/11/20 CGI 及其環境簡介(cont) 哪些平台上有 Perl?要到哪裡去找? 這套原始碼完全不需任何移植工作便可輕易地在絕大多數的 Unix系統(Perl的原生系統),以及 Plan 9、VMS、QNX、 OS/2 ,和 Amiga上編譯安裝完成。 適合 32 位元的微軟系統和蘋果系統、以執行檔形式發行的 Perl各可在 http://www.perl.com/CPAN/ports/這個目錄底下找到。 http://www.math.ncu.edu.tw/~chenym/perl/ 2018/11/20 國立中央大學電算中心 陳慶彥
CGI 及其環境簡介(cont) Perl的相關資料要上哪兒找? man perl perldoc perl 2018/11/20 CGI 及其環境簡介(cont) Perl的相關資料要上哪兒找? man perl perldoc perl http://www.perl.com/perl/info/documentation.html 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-執行環境 server 通常是設定成去執行放在 ``cgi-bin‘’ 目錄底下的 CGI 程式。不過, server 管理者同時也可以在設定檔中設定 aliases,讓所有含某些副檔名(如 .cgi、.pl)的 scripts 都能執行 <Directory /home/httpd/cgi-bin> AllowOverride None Options ExecCGI </Directory> <Directory /home/*/public_html> Options Indexes Includes ExecCGI order allow,deny 什麼是檔案使用權限?怎樣改? Q3.1: 我的 Perl CGI 程式要放在哪裡執行?cgi-bin 這個目錄是做甚麼用的? server 通常是設定成去執行放在 ``cgi-bin'' 目錄底下的 CGI 程式。不過, server 管理者同時也可以在設定檔中設定 aliases,讓所有含某些副檔名(如 .cgi、.pl)的 scripts 都能執行*。 【譯者】設定 CGI aliases 和副檔名固然很方便,但 server 管理者須注意到相關的安全問題。 Q3.2: 什麼是檔案使用權限?怎樣改? 檔案權限是根據使用者識別代號(又稱 uid),以及他們所屬的團體來決定是否賦與使用者讀、寫,和執行某檔案的權利。您可使用 chmod 這個指令去修改檔案的使用權限。例如: % ls -ls form.cgi 1 -rwx------ 1 shishir 974 Oct 31 22:15 form.cgi* 此一檔案的權限為 0700(八進制),意味著沒有人(檔案所有人除外)能夠讀取、寫進,或執行這個檔案。我們可以用 chmod 這個指令去修改它的權限: % chmod 755 form.cgi % ls -ls form.cgi 1 -rwxr-xr-x 1 shishir 974 Oct 31 22:15 form.cgi* 這樣一來,權限就變了。現在和 ``shishir'' 在同一個團體的使用者,還有其他任何的使用者都有權利去讀取和執行這個檔案了。 如欲知 chmod 指令各八進制數碼所代表的含意,請參閱 chmod manpages的說明。 Q3.3: Perl 應該安裝在哪裡才可以執行它? Perl 可以安裝在系統上任何一個角落!您唯一要注意的是 server 不能在chroot 的環境下跑,否則它便無法跑 perl 解譯器。換言之,系統管理者可以把根目錄改變,讓 ``/'' 指到另一個目錄,而不是實際真正的根目錄(``/'')。 Q3.4: 我為什麼一直得到 ``Server: Error 500'' 的訊息? 以下幾種情形會觸發這個錯誤訊息: 如果 script 開頭的地方沒有 ``#!/usr/local/bin/perl'' 這個指到 Perl 解譯器的標頭,或者是指到解譯器(或 library 檔)的路徑錯誤。 如果 script 輸出的第一行是一個不正確的標頭(即 ``Content-Type: text/html'' ),或者是該標頭後面沒有跟著一個空行。 如果您的 script 有句法上的錯誤。您的 scripts 都應在指令列先跑跑看才是。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Lab 1.您的第一個程式 選擇編輯器 2018/11/20 Perl程式設計-Lab 1.您的第一個程式 選擇編輯器 vi , joe , ee , pe2或是在client端將編輯好了的檔案上傳到server 您的第一個程式hello.cgi #! /usr/bin/perl print “hello world! \n”; Chmod 755 hello.cgi 執行hello.cgi 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態 Scalar:純量變數是Perl裡最基本的一種資料型態,它可以代表一個字元、字串、整數、甚至浮點數,而Perl把它們都看成是一樣的! Scalar Array:純量陣列,陣列內的每一個元素都是Scalar variable Hash Array(Associative Array):雜湊陣列也叫做相關陣列,它和一般陣列沒什麼不同,差別只是在它的索引值用的是字串,而非一般陣列所用的整數值 References(Pointer):Perl 5新增了參考指標的資料型態使Perl和C一樣可借由指標建立一些複雜的資料結構。 純量變數是Perl裡最基本的一種資料型態,它可以代表一個字元、字串、整數、甚至浮點數,而Perl把它們都看成是一樣的東東! 你甚至可以混著用,不可思議吧。例如: # 井字號開頭的後面都是註解。 # 純量變數以$開頭。 # my 是一種宣告變數的方式,它可以使變數區域化。 # 宣告變數時若不加 my 或 local 則Perl會把它當作全域變數使用。 # 習慣上,我們會將字串用雙引號括起來,而數值就不用加引號。 my $x="abc"; my $x=123; my $x=4.56; 那麼程式怎麼判斷這是數值還是字串呢? 其實不是程式判斷,而是你自己要判斷。Perl分別提供了一堆運算子來處理數字和字串,你必須知道這個變數是數值或字串,才能使用個別的運算子來對變數做運算。我分別列出字串運算子和數值運算子,好讓大家能區分它們的不同。 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態(cont) Scalar:字串運算子 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態(cont) Scalar:字串運算子 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態(cont) Scalar:數值運算子 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態(cont) Scalar:數值運算子 2018/11/20 國立中央大學電算中心 陳慶彥
2018/11/20 Perl程式設計-資料型態(cont) Scalar:數值運算子 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont)-Lab 2 2018/11/20 Perl程式設計-資料型態(cont)-Lab 2 Lab2. Stg1.cgi #! /usr/bin/perl $name = "Eric C. Herrmann"; print "The owner of this program is $name\n"; $firstName = "Eric "; $middleInitial = "C. "; $lastName = "Herrmann"; print "The owner of this program is $firstName $middleInitial"; print "$lastName\n"; $fName = "Eric"; $mInitial = "C."; $lName = "Herrmann"; print "The owner of this program is $fName $mInitial $lName\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) Type Notation Example Integer NN 12 Floating point 2018/11/20 Perl程式設計-資料型態(cont) Type Notation Example Integer NN 12 Floating point NN.NN 342.176 Scientific NN.NNENN 42.04E-6 Big number NN_NNN_NNN 6_000_000 Hex 0xNNNN 0xFFD3 Octal 0NNN 0374 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont)-Lab 3 2018/11/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 = 0x0F3; $octalValue = 037; $itotal = $integerValue + $hexValue; $ftotal = $floatingPointValue + $integerValue; $dtotal = $divisionValue+ $octalValue; print "Integer \t $integerValue\n"; print "Floating Point \t”; Print “$floatingPointValue\n"; print "Scientific \t $scientificValue\n"; print "National Debt \t $nationalDebt\n"; print "Division \t $divisionValue\n"; print "Hex \t\t $hexValue\n"; print "Octal \t\t $octalValue\n"; print "\n\n"; print "itotal = $itotal\n"; print "ftotal = $ftotal\n"; print "dtotal = $dtotal\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態-Lab 3(cont) 2018/11/20 Perl程式設計-資料型態-Lab 3(cont) 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) Scalar Array: 2018/11/20 Perl程式設計-資料型態(cont) Scalar Array: 純量陣列,陣列內的每一個元素都是Scalar variable。宣告及使用方式如下: # 純量陣列以 @ 開頭。 my @array; my @array=qw(a b c d); # qw 函數會將其後的每個元素用逗點隔開,效果就像下面這行。 my @array=("a","b","c","d"); 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) Scalar Array: 2018/11/20 Perl程式設計-資料型態(cont) Scalar Array: # 當然你也可以一個個元素宣告,下面就是存取每一個元素的方法。 # 因為陣列中的每一個元素都是純量變數,所以要以 $ 開頭, # 剛開始容易搞混,請注意。 $array[0]="a"; $array[1]="b"; $array[2]="c"; $array[3]="d"; # 使用for loop印出陣列內每個元素的值。 for($i=0; $i<=$#array; $i++) { print "$array[$i]\n"; } 看到$#array這個奇怪的東東沒? 這是Perl的一個特殊用法,代表這個陣列最後一個元素的註標。由於Perl不必事先宣告變數,也不必預先宣告陣列的大小,甚至可以隨時增加新元素,那我們怎麼知道這個陣列到底有多大呢? 透過這個特殊變數我們可以得知這個這個陣列最後一個元素的註標,自然而然也就知道這個陣列究竟有多大了。另外Perl只定義了一維陣列的語法,二維以上只能用指標間接來達成。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont)-Lab4 2018/11/20 Perl程式設計-資料型態(cont)-Lab4 Lab 4 scalearray1.cgi #!/usr/bin/perl @FamilyName = ("Steven", "Michael", "Herrmann"); print $FamilyName[0]; print $FamilyName[1]; print $FamilyName[2]; print "\n\n"; print "$FamilyName[0] $FamilyName[1] $FamilyName[2]\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont)-Lab5 2018/11/20 Perl程式設計-資料型態(cont)-Lab5 Lab 5 scalearray2.cgi(Mixed Data Assigned to Array Cells ) #!/usr/bin/perl $cellIndex = 0; $mixedData[$cellIndex] = \@mixedData; $mixedData[2] = 876; $mixedData[6] = "The last cell"; $mixedData[4] = 3.41467; foreach $value (@mixedData){ print "Cell number $cellIndex = $value \n"; $cellIndex++; } print "\n\n"; print "The last cell of the array mixedData is $#mixedData"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計- 資料型態-Lab5(cont) 2018/11/20 Perl程式設計- 資料型態-Lab5(cont) 2018/11/20 國立中央大學電算中心 陳慶彥
Hash Array(Associative Array) 2018/11/20 Perl程式設計-資料型態(cont) Hash Array(Associative Array) # 相關陣列是以 % 符號開頭的。 my %hash; my %hash=("i1"=>"aaa","i2"=>"bbb","i3"=>"ccc"); $hash{'i1'}="aaa"; $hash{'i2'}="bbb"; $hash{'i3'}="ccc"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) -Lab6 2018/11/20 Perl程式設計-資料型態(cont) -Lab6 Lab 6 hasharray.cgi #!/usr/bin/perl print "\n\n"; %priceList = ( "Hackamore"=>28.92, "English Bridle"=>36.31, "Western Saddle"=>124.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 $priceList{'Western Saddle'}\n"; %priceList = ( 1358=>28.92, 1359=>36.31, 1965=>124.00, 1966=>178.01, 1977=>205.87, 1357=>24.56, ); 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態-Lab6 (cont) 2018/11/20 Perl程式設計-資料型態-Lab6 (cont) Lab 6 hasharray.cgi (cont) print "Or like this $priceList{1965} \n\n"; printAA(%priceList); sub printAA { my %myPriceList = @_; foreach $key (keys(%myPriceList)){ print "The price of item $key is $priceList{$key}\n"; } print "\n\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態-Lab6 (cont) 2018/11/20 Perl程式設計-資料型態-Lab6 (cont) 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) References(Pointer) 2018/11/20 Perl程式設計-資料型態(cont) References(Pointer) ⊙如何取得變數的位址? $scalarRef=\$scalarVar; $arrayRef=\@arrayVar; $hashRef=\%hashVar; $funcRef=\&funcName; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont) References(Pointer) 2018/11/20 Perl程式設計-資料型態(cont) References(Pointer) ⊙如何使用指標? print $$scalarRef; print "@$arrayRef"; print $hashRef->{$key}; &$funcRef; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-資料型態(cont)-Lab7 2018/11/20 Perl程式設計-資料型態(cont)-Lab7 Lab 7 pointer.cgi #! /usr/bin/perl $hashRef={'a'=>'aa','b'=>'bb','c'=>'cc'}; print "$hashRef->{'a'}\t$hashRef->{'b'}\t$hashRef->{'c'}\n"; my %hashRef1=('a'=>'aa','b'=>'bb','c'=>'cc'); print " $hashRef1{'a'}\t $hashRef1{'b'}\t $hashRef1{'c'}\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-控制敘述 條件控制敘述 (Conditional Control Statements) 2018/11/20 Perl程式設計-控制敘述 條件控制敘述 (Conditional Control Statements) if (Expression) {Code Segment} if (Expression) {Code Segment} else {Code Segment} statement if (Expression); statement unless (Expression); 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-迴圈控制敘述 迴圈控制敘述 (Loop Control Statements) 2018/11/20 Perl程式設計-迴圈控制敘述 迴圈控制敘述 (Loop Control Statements) for($i=0; $i<=10; $i++) {Code Segment} foreach $i (@array) {Code Segment} for $i (0..10) {Code Segment} while($i<=10) {Code Segment} do {Code Segment} while(Expression); 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-控制敘述-Lab8 Lab 8 if.cgi #! /usr/bin/perl my @custom; 2018/11/20 Perl程式設計-控制敘述-Lab8 Lab 8 if.cgi #! /usr/bin/perl my @custom; $custom[0]='張三'; $custom[1]='李四'; $custom[2]='王五'; for ($i=0; $i<=$#custom; $i++){ if ( $custom[$i] eq '李四'){ print "我是李四\n"; } $cnt=0; while ($cnt<=$#custom){ print "我是$custom[$cnt]\t"; $cnt++; } print “\n”; # 第一個引數是純量變數,第二個引數要用#括號括起來,裡面是一個純量陣列, 顧名#思義它就是把陣列中的每個元素依序傳給#第一個引數,直到全部傳完。 foreach $i (@custom){ print "我是$i\t"; } 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-副程式(Subroutines) Syntax: sub NAME {Code} 呼叫副程式: &NAME(para1, para2,...) 參數傳遞: @_ 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-副程式(Subroutines) 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-I/O和檔案處理 Syntax: open(FILEHANDLE,"Expression"); 可以開啟一個以 string 指定檔名的檔案, 並傳回檔案代碼給 filehead 這個函式,如果執行程功的話, 會傳回true, 否則就傳回 undef. 如果開頭字元為 < (或是沒有特別的字元) 檔案會以讀取模式開啟 如果開頭字元為 > ,就會以寫入模式開啟 如果開頭字元是以 >> ,就會以新增模式開啟 如果開頭字元為 + (例: + > , < + ) 開啟的檔案會可讀又可寫 close(FILEHANDLE); 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-I/O和檔案處理-Lab9 Lab 9 file.cgi #! /usr/bin/perl $FileName=">test.txt"; open(WFILE, "$FileName"); print WFILE "123\n"; print WFILE "456\n"; print WFILE "789\n"; close(WFILE); #讀取test.txt內容$FileName="<test.txt"; my @MyDept; open (FILE,"$FileName") || die $!; @LINES=<FILE>; close(FILE); $SIZE=@LINES; for ($i=0;$i<$SIZE;$i++){ $MyDept[$i]=$LINES[$i]; print "$MyDept[$i]"; } 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-控制字元 \n 換行 \t 定位(tab) \a 警示(發出嗶聲) \r 歸位 \f 跳頁 \cD Ctrl-D \cC Ctrl-C 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions Regular Expression通常是用來尋找特定的字串樣式(pattern),也就是所謂格式辨認(pattern-matching)的功能。它的運算子是『=~』和『!~』,可以把它念做match和not match。 Syntax: $string =~ /regular expression/expression modifier 例:$sentence =~ /Hello/ 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計- -Regular Expressions Modifiers:修飾選項可有可無,它是用來對整個敘述作修正的。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計- -Regular Expressions Metacharacter:下面這些字元都具有特殊意義,可以讓你建立更複雜的 搜尋樣式(searching pattern)。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計- -Regular Expressions Pattern Quantifier:用來表示字元的數量關係。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計- -Regular Expressions Character Patterns:下列的sequence用來match一些特定格式的字元 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions-Exam. /abc/ 找到含有abc的字串 /^abc/ 找到開頭是abc的字串 /abc$/ 找到結尾是abc的字串 /a|b/ 找到有a或b的字串,也可以用來找整個字(word) 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions(cont) /ab{2,4}c/ 找到a後面跟著2-4個b,再跟著c的字串,若只有/ab{2,}c/則會找二個以上的b /ab*c/ 找到a後面跟著0個或多個b,再跟著c的字串,如同/ab{0,}c/ /ab+c/ 找到a後面跟著一個以上的b,再跟著c的字串,如同/ab{1,}c/ 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions(cont) /a.c/ .可以代表任何字元,除了new line字元(\n)外。 /[abc]/ 找到含有這三個字元中任何一個的字串 /\d/ 找到含有數字的字串,如同/[0-9]/ /\w/ 找到含有字母的字串,如同/[a-zA-Z0-9_]/ 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions(cont) 找到含有white space的字串,如同/[ \t\r\n\f]/ /[^abc]/ 找到沒有abc任一字元的字串 /\*/ 找到含有字元*的字串,在反斜線"\"後面的字元Perl會把它當作普通字元看待。若你不確定這個符號是否為特殊字元,乾脆全加上\以策安全。 /abc/i 忽略abc的大小寫 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions(cont) /(\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/ 把用":"分開的兩個欄位互相對調 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions(cont) $x =~ tr/this/that/ 把"this"替換成"that" $x =~ tr/a-z/A-Z/ 把小寫字母全部替換成大寫字母 $count = $x =~ tr/*/*/ 計算$x中有幾個"*" 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions-Lab10 Lab 10 regular1.cgi #! /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*)$|); print “處理的字串:$url\n"; print “處理後的主機名稱:$host\n"; print "處理後的主機port:$port\n"; print “處理後的檔名:$file\n"; 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions-Lab10 $url=~m|| m命令可以讓你自訂pattern的分隔符號,m後面跟著的就是分隔符號,| |是在字串中尋找多個pattern。 ([^/:]+) match一個字串,裡面沒有/和:字元。找到的字串存在$1中。 :{0,1}(\d*) match 0或1個:,後面跟著一串數字或nothing。找到的字串存在$2中,若找不到,$2就是空的。 (\S*)$ match一串非空白字元,並以找到的字串為結尾。找到的字串存在$3中。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-Regular Expressions-Lab10 (\S*)$ match一串非空白字元,並以找到的字串為結尾。找到的字串存在$3中。 ()=() ($host, $port, $file)=($1, $2, $3) 即$host="my.machine.tw" $port=8080 $file="/cgi-bin/test.pl" 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式 HTTP headers(表頭) HTTP通訊協定是一種很簡單的client-server通訊協定,client和server之間的溝通由兩部分所組成,一是HTTP headers,另一就是文件或資料本身了,中間則以一個空白行隔開。 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式 由於瀏覽器和HTTP server都有很多不同的版本,所使用的HTTP headers也各不相同,常用的HTTP headers有下列幾種: Header 範例與說明 Status 傳回的狀態碼,若沒有錯誤就會出現200 OK 例:HTTP/1.1 200 OK Content-type 輸出字串的MIME格式。 例:Content-Type: text/html Content-length 輸出字串的長度,通常以byte計算。 例:Content-Length: 2736 Location Server重新導向,也就是叫瀏覽器再連到另外的這個位址。 例:Location: http://www.ncu.edu.tw/ Pragma 關掉瀏覽器的cache,也就是不要把這份文件存在cache中。 例:Pragma: no-cache 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式 這是一個由Netscape Navigator 3.0版所發出的request: GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/3.0 (WinNT; I) Host: ind.ntou.edu.tw Accept: image/gif, image/x-xbitmap, image/jpeg, */* 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式 而ind的apache HTTP server的回應則是: HTTP/1.1 200 OK Date: Sat, 06 Sep 1997 03:32:12 GMT Server: Apache/1.2b11 Last-Modified: Mon, 16 Jun 1997 14:03:10 GMT ETag: "b5496-ab0-33a5479e" Content-Length: 2736 Accept-Ranges: bytes Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html <html><body bgcolor="#ffffff"><title>Welcome to NTOU CC Email/WWW Server</title> ...... </body></html> 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式 輸出網頁內容的步驟 先輸出 "Content-type: text/html\n\n" 再輸出網頁的內容 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式-Lab11 #! /usr/bin/perl PrintHeader(); print "<html><body>"; PrintENV(); print "</html></body>"; sub PrintHeader { print "Content-type: text/html\n\n"; } sub PrintENV { my $key; foreach $key (sort keys %ENV) { print "$key = $ENV{$key}<br>\n"; } 2018/11/20 國立中央大學電算中心 陳慶彥
Perl程式設計-利用Perl撰寫CGI程式-Lab11 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作 – 公佈欄 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄-系統架構 功能架構 瀏覽公告 張貼公告 帳號管理 系統管理 版權宣告 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄-系統架構 執行News.cgi 輸入“” 輸入“系統管理” 輸入“帳號管理” 輸入“張貼公告” ReadNews(); ReadPara(); SystemConfigForm(); 輸入“系統管理” ReadDept(); AddUserForm(); 輸入“帳號管理” ReadUser(); 輸入“張貼公告” PostNewsForm(); 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄(cont) CGI 功 能 說 明 CGI 是 Common Gateway Interface 的 簡 稱. 其 主 要 的 功 能 是 在 WWW 環 境 下, 藉 由 從 使 用 者 端傳 遞 一 些 訊 息 給 WWW 伺 服 軟 體, 再 由 WWW 伺 服 軟 體去 啟 動 所 指 定 的 程 式 碼 來 完 成特 定 的 工 作. 所 以 更 明 確 的 說, CGI 僅 是 在 WWW 主 機 端 上 的 可 執 行 的 程 式 碼. 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄-資料傳遞 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄-Client傳送data # 副程式: 系統登入 sub Login { print_top(); print "<center>"; print "<form action='$MyPara{'CGIFileName'}?$temp_function' method='post'>"; <p>帳號:<input name='login_name' size='20'></p>”; <p>密碼:<input name='login_password' type='password' value size='20'></p>"; print “<input name=‘B1’ type=‘submit’ value=‘系統登入’>”; print “<input type='reset' value='清除設定'>"; print "</form>"; Print “</center>";print_bottom(); } 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作–公佈欄-Server端接收data @in = split(/&/,$in); foreach $i (0 ..$#in) { $in[$i] =~ tr/+/ /; # Convert plus's to spaces # Split into key and value # splits on the first = ($key, $val) = split(/=/,$in[$i],2); # Convert %XX from hex numbers to alphanumeric $key =~ s/%(..)/pack("C",hex($1))/ge; $val =~ s/%(..)/pack("C",hex($1))/ge; $val =~ s/<!--(.|\n)*-->//g; # Kill SSI command # Associate key and value # \0 is the multiple separator if (defined($in{$key})) { $in{$key} = join("\0", $in{$key}, $val); } else { $in{$key} = $val; } } return 1; } ReadForm(*FORM); Print “$FORM{‘login_name’}”; Print “$FORM{‘login_password’}”; sub ReadForm { local (*in) = @_ if @_; local ($i, $key, $val); # Read in text if ($ENV{'REQUEST_METHOD'} eq "GET") { $in = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); if ($ENV{'QUERY_STRING'} =~ /=/) { $in = join("&", $in, $ENV{'QUERY_STRING'}); } 2018/11/20 國立中央大學電算中心 陳慶彥
應用系統實作-公佈欄 程式碼講解(請參考附件) 2018/11/20 國立中央大學電算中心 陳慶彥
測驗-檔名(exam.cgi) 請利用perl設計一個可供使用者登入資料與顯示資料的CGI程式 2018/11/20 國立中央大學電算中心 陳慶彥