CGI程式設計(for UNIX Perl)

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

Web Programming 網際網路程式設計
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
5.1 – 表格(FORM) 輸入元素 : 兩種傳遞方法 : GET or POST 範例 1. 文字欄位 Text box
Lab312.
題目:十六對一多工器 姓名:李國豪 學號:B
Chapter 5 迴圈.
2018/11/11 CGI程式設計進階 (for UNIX Perl) 國立中央大學電算中心 陳慶彥.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
臺北市立大學 資訊科學系(含碩士班) 賴阿福
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Java簡介.
物件導向程式設計 CH1, CH2.
TCP協定 (傳輸層).
第一篇 Unix/Linux 操作介面 第 1 章 Unix/Linux 系統概論 第 2 章 開始使用 Unix/Linux
JDK 安裝教學 (for Win7) Soochow University
第1章 認識Arduino.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
生物資訊程式語言應用 Part 3 Perl Language.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
安裝JDK 安裝Eclipse Eclipse 中文化
Merge Partners’ programs by Matlab
Echo Server/Client Speaker:Fang.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A.
檔案與磁碟的基本介紹.
Java 程式設計 講師:FrankLin.
FTP檔案上傳下載 實務與運用.
網頁切換移轉 JS vs. ASP.NET.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
表單(Form).
Topic Introduction—RMI
第一單元 建立java 程式.
VS.NET 2003 IDE.
Ch20. 計算器 (Mac 版本).
雲端計算.
網頁程式概論 建國科技大學資管系 饒瑞佶 2015/9 V1 2016/4 V2 2016/9 V3.
網頁資料知多少? 事 實 ? 謠言?.
輸入&輸出 函數 P20~P21.
表格(HTML – FORM).
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
期末考.
挑戰C++程式語言 ──第8章 進一步談字元與字串
個人網路空間 資訊教育.
探測工具:NetCat.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
利用 EditorConfig 自訂文字編輯器設定
表格(HTML – FORM)
挑戰C++程式語言 ──第7章 輸入與輸出.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
陣列與結構.
基本指令.
Dreamweaver 進階網頁製作 B 許天彰.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A.
資料表示方法 資料儲存單位.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
作業系統實習課(二) -Scheduler-Related System Calls-
開發Java程式語言的工具 JDK.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Chapter 4 Multi-Threads (多執行緒).
Unix指令4-文字編輯與程式撰寫.
Develop and Build Drives by Visual C++ IDE
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

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 國立中央大學電算中心 陳慶彥