Perl
貳、純量
一、數字
- 正負整數:435,小數(浮點)。
- 科學符號:5e20。
- 十六進位:0x55ff。
- 八進位:0435。
二、字串
- 字串長度由0至全部可用記憶體。
(一)單引號字串:
- 變數名當成普通字串,不代入變數值。
- 以\代表反斜字元,以\\代表一個反斜。
- 以\'代表'字元。
(二)雙引號字串:
- 變數名以變數值代入。
- \a:bell
- \b:倒退
- \c任意字元:Ctrl-任意字元
- \e:ESC
- \f:換頁
- \l:下一個字元小寫
- \b:換行
- \r:RETURN
- \t:定位字元TAB
- \u:下一個字元大寫
- \x:輸入十六進位數字
- \v:水平定位
- \\:反斜
- \":雙引號
- \:輸入八進位數字
- \L:以下小寫直到\E為止
- \U:以下大寫直到\E為止
- \Q:將所有的特殊字元加上反斜線,直到\E為止
- \E:結束之前的\L、\U或\Q
三、算符
- 指數(**):A**B,A的B次方。
- 字串比較算符:lt,gt,le,ge,eq,ne,cmp,比ASCII碼大小,第一字元如相同比第二字元。數字字串和數字不同,"345"小於"62",但345大於62。
- 字串連結算符(.):字串一.字串二.字串三…。
- 字串重複算符(x):字串一x次數。
- 字串大小寫算符:lc 字串 為字串全部變小寫;lcfirst 字串 為字串第一個字每變小寫;uc 字串 為字串全部變大寫;ucfirst 字串 為字串第一個字每變大寫。
- 字串刪除尾部:chop 字串 刪字串最後一個字元;chomp 字串 刪字串最後的換行字元。
- 算符的優先順序(P2-31)。
- 型別轉換:字串被數值算符處理時,所有的非數字會被刪除,餘下的做計算。數字被lt處理時,會被比較ASCII大小。
五、串列
- ( , , …):由獨立的純量所構成,可以包含數字和字串,元素個數沒有限制。
- 串列不一定要有名字,但陣列和雜湊都是有名字的串列。
- ():空串列
- 以範圍指定串列值;(1..10):十個元素。(5..5):一個元素。(2.5..7.9)=(2.5,3.5,4.5,5.5,6.5,7.5)。(a..z)。(a..z,1..10) 。($user1..$user2)。
- qw(quote word):將句子以空白裁成串列。如qw(Bill Ted Jack Jill)為("Bill","Ted","Jack","Jill")
- ($變數名1,$變數名2,$變數名3…)=@陣列名;
- ($變數名1,$變數名2,$變數名3…)=@_;
- 將某個不存在的陣列元素指給變數時,變數值設為null。
參、常規表示式(regular expression)
- /常規式/
- 字串=~/常規式/;找到傳回真
- 字串!~/常規式/;找到傳回偽
- =~/SR+/;SR,SRR,SRRR,SRRRR…都算,而且取R最多的那一個。也可用=~/SR+T/;
- =~/gr*eat/;r出現0或多次都算,即geat也算,並取r最多者。
- =~/gr?eat/;r出現0或一次都算,即只geat和great兩個算。
- =~/gr{3,6}eat/;r出現3-6次都算。也可用{0,5}(0-5次),{2,}至少兩次,{2}正好兩次。
- =~/a.t/;a和t之間放任何一個字元都算合,除了\n以外。
- =~/200[0123456789]/;2000-2009都合。
- =~/I am yelling[.!]/;句末不論是.或!都合。也可用[0-9]和[a-z]…
- 在常規式中要用+、*、?、.、[、]、\等字元,字元前要加\。
- =~/\beat/;找eat且eat須在字的開頭。
- =~/eat\b/;找eat且eat須在字的尾端。
- =~/\beat\b/;只有eat是字串中的一個字時才合。
- \B和\b相反,表示必須有其他字元相連(不算和空白相連)才合
- =~/^eat/;eat必須在整個字串的最前
- =~/eat$/;eat必須在整個字串的最後
- \d代表[0-9]即數字、\D代表[^0-9]即非數字、\w代表[a-zA-Z0-9]即字、\W代表[^_a-zA-Z0-9]即非字、\s代表[\r\t\n\f]即空白、\S代表[^\r\t\n\f]即非空白。
- =~/2000|2001/;找2000或2001
- 在常規式/…/間加(),每一組被找到的常規式被儲存起來,由左到右每一組用1,2,3…表示。即找到的第一組()存起來用1表示,找到的第二組()存起來用2表示。
- 如"this-is-an-example=~/([a-z]+)(-)\1\2\1/;找連續小寫字當作1,找hyphen當作2,整個找"連續小寫字hyphen連續小寫字hyphen連續小寫字"。
- 承上二項,找到的第一組常規式存入$1,第二組常規式存入$2。
- 如/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/,找%後跟著兩個字元,找到把這兩個字元存起來,後面的$1即代表前面儲存起來的這兩個字元。
- 前一個成功比對的樣式存入$&。
- 優先順序:+,*,?,{},^,$,\b,\B,|
- 常規式/…/後接字元:i忽略大小寫;g找出所有成功比對樣式,但只有存入陣列或使用迴圈時才會發生作用;o常規式只被運算一次,即被固定下來。p7-27
- 字串=~s/被換/換成/; 字串的內容會被改變。/…/…/後接字元:i忽略大小寫;g所有成功比對的都換;e常規式以運算看待,如9*9沒e時視為"9*9",有e時視為"81"。
- 字串=~tr/被換/換成/;例如:字串=~tr/thed/abc/;字串中所有的t換成a,所有h換成b,所有e換成c,所有d換成c,不必加g即會全部都換。
- 字串=~tr/常規式/換成/c;除了合常規式以外都換。如字串=~tr/a-z/\t/c;除了小寫字元外全部字元換成TAB字元。
- 字串=~tr/a-z //d;除了小寫字元及其隨後之空白外,其他字元全刪。
- $value =~ s/\+/ /g;把+號換成空白
- $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;把特殊字元依ASC碼換成字符。
- pack()可以用在///的後段當作要換上的東西,不能放在前段當作要找的東西。
肆、控制結構
四、foreach
- foreach $變數名 (@陣列名) {把陣列中每一個元素,拿來代入變數名做一次}
- @num3=("一","二","三","四","五");foreach $num (@num3) {print $num."<br>";}
- foreach (@陣列名) {把陣列中每一個元素,拿來代入$_,各做一次}
伍、檔案
- open (filehandle,"檔名");讀檔,有時可配合@陣列名=<某個filehandle>;取出資料
- open (filehandle,">檔名");將檔案內容清空以覆寫檔案,要配合print 某個filehandle " ";寫入新資料
- open (filehandle,">>檔名");加到檔尾
- open (filehandle,"+<檔名");檔案開在讀取寫入模式,不會傷到檔案內容。
- open (filehandle,"|程式 參數");
- close (filehandle);關檔,將filehandle釋放還給系統
- @陣列名=<filehandle>;檔案中的每一行存成陣列中的一個元素。
- $某變數=<filehandle>;while($某變數){print "$某變數\n";$某變數=<filehandle>;}:輸出檔案中的每一行的內容。
- read(檔案代碼,$變數名,長度,從檔頭算跳過多少byte);檔案代碼即filehandle。每一次read是添附新的部分到變數來,不是蓋掉變數原有的內容。p6-11
- tell(檔案代碼);目前位置距檔頭多遠。
- seek(檔案代碼,長度,參數);參數為0表從檔頭算起,參數為1表從目前的位置算起,參數為2表從檔尾算起,
- binmode(檔案代碼);以二元檔格式處理。
- <STDIN><STDOUT>不必開關。
- <STDIN>視為一陣列,其值一行行存於@_。
- open (STDOUT,">檔名");標準輸出重新導向,所有print由螢幕轉向檔案。
- rename("舊檔名","新檔名);
- unlink("檔名");永久刪除檔案
- chmod(mode,"檔名);改變屬性
- 檔案測試:p6-22。如if(-e 檔名){…}。-e檔名是否存在;-M上次修改到現在的時間;-r檔名是否可被讀取;-z是否空檔…。
- mkdir("目錄名",mode);
- chdir("目錄名");
- opendir(目錄代碼,"目錄名");開目錄以便讀取
- closedir(目錄代碼);關目錄
- readdir(目錄代碼);傳回目錄的第一個檔案或子目錄,可用迴圈讀全部。
- telldir(目錄代碼);傳回目錄清單的位置
- rewindir(目錄代碼);重回目錄清單開頭
- rmdir("目錄名");刪目錄
陸、副程式
- 定義副程式:sub 副程式名 {}
- 叫用副程式:
- &副程式名:既不傳入也不傳出副程式。
- &副程式名(參數1,參數2…):傳入參數並執行副程式。
- $變數名=副程式名(參數1,參數2…):傳入參數,並傳回結果。
- 參數傳入副程式,放入 @_陣列。
- return 傳回值;
- 不用return結束副程式,傳回最後一個敘述的計算結果。
- 載入副程式:require "含副程式之檔名";或use 檔名;
- 被載入含副程式之檔,檔末(不是副程式末)要加return true;
- 用local…;定義本地變數,只在副程式內有效,返還母程式時釋出。local定義的變數,其下階巢狀副程式可以引用。
- 用my…;也可定義本地變數,且其下階巢狀副程式不可以引用。
- 進一步參看p5-21、p5-29。
捌、特別變數
一、環境變數:以cgi(tenv.cgi)遠端查Cobalt_Qube
- $ENV{'REMOTE_ADDR'} 是使用者的 IP: 211.74.14.35
- $ENV{'HTTP_USER_AGENT'} 是使用者的基本作業環境: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
- SERVER_SOFTWARE = Apache/1.3.3 Cobalt (Unix) (Red Hat/Linux)
- GATEWAY_INTERFACE = CGI/1.1
- DOCUMENT_ROOT = /home/groups/home
- REQUEST_METHOD = GET
- QUERY_STRING =
- HTTP_ACCEPT = application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
- REMOTE_PORT = 2292
- HTTP_ACCEPT_LANGUAGE = zh-tw
- REDIRECT_UNIQUE_ID = OyyCmMCoAKoAADhpqjA
- HTTP_ACCEPT_ENCODING = gzip, deflate
- REDIRECT_STATUS = 200
- SCRIPT_FILENAME = /usr/cgiwrap/cgiwrap
- SERVER_NAME = www.jendo.org
- SERVER_PORT = 80
- PATH_TRANSLATED = /home/groups/home/tenv.cgi
- SERVER_ADMIN = admin@www.jendo.org
- UNIQUE_ID = OyyCmMCoAKoAADhpqjA
- REDIRECT_URL = /tenv.cgi
- SCRIPT_URI = http://www.jendo.org/tenv.cgi
- SCRIPT_URL = /tenv.cgi
- SERVER_SIGNATURE =
- SERVER_PROTOCOL = HTTP/1.1
- HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
- PATH = /sbin:/usr/sbin:/bin:/usr/bin
- HTTP_CONNECTION = Keep-Alive
- REDIRECT_SCRIPT_URI = http://www.jendo.org/tenv.cgi
- SCRIPT_NAME = /groups/home/tenv.cgi
- REDIRECT_SCRIPT_URL = /tenv.cgi
- REQUEST_URI = /tenv.cgi
- PATH_INFO =
- HTTP_HOST = www.jendo.org
二、暫存陣列@_:
- foreach省略變數名時,陣列中各元素代中$_各做一次。foreach (@陣列名) {…;}
- 叫用副程式時,母程式以參數傳入@_,交給副程式。副程式中可以用…=@_;取出使用。
- <STDIN>視為一陣列,其值一行行存於@_。
玖、動詞
- @陣列名=split(/字串/,$變數名);把變數在字串處切成數段,各段存入陣列中。
- @pairs = split(/&/,$finfo);
- ($name,$value) = split(/=/,$pair);把$pair在=處切成兩段,前段為$name,後段為$value
- read(filehandle,$變數名,長度);把檔案內容給變數並設定變數長度,如read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
- localtime(秒數),將秒數換算成秒、分、時、日、月、年,放入@_。其中年自1900年算起,月份需加一。因三個月零八天就已經邁入四月了。
拾、表單(Form)
傳東西給cgi
一、Form的屬性:
- action=CGI程式的位置。可以省略,瀏覽器會把此表單交給提供這個表單的主機。所以我們可以建立一個提交給其他主機的表單,但這樣子做在大部分的瀏覽器會得到警告訊息。
- method=get 或 post。優先用post,不經URL傳遞,不限傳遞資料的長度。get是預設值,將表單資料附在實際程式的URL之後,URL可能太長,導致超過系統允許的長度,而被截短導致錯誤。
- enctype交代資料型態。最常用enctype=application/x-www-form-urlencoded。
用get時,可用QUERY_STRING環境變數來取得,其他人也可以透過這個環境變數取得傳遞資料。
兩者方法都可以用CONTENT_LENGTH環境變數來查傳遞資料的長度,進一步提取資料到變數。
二、內含標籤:
select、input、textarea皆可用name屬性對其資料命名,變成資料名=輸入的資料,然後送往STDIN。
- select夾OPTION。以size屬性決定顯示列數。各OPTION以value指定name要對應的值。選那一個傳回那一個值。
- select 可加multiple屬性,讓之後的OPTION可以複選。
- input的各種型態:
- type="text":文字。由使用者輸入其值。以size屬性,maxlength屬性,定輸入框及輸入字串的寬度。
- type="password":同文字,只是字元不顯出來。
- type="checkbox" value="xxx":核取盒。每一個個核取項目要有一個input標籤。
- type="radio" value="xxx":同一組選項中僅選一個。同組中每一選項有一個input標籤,但其name屬性皆相同。
- type="hidden" value="xxx":直接傳值給後端,不必有任何顯示及動作。
- type="reset" value="xxx":不傳資料至後端,只是清空前端的表單重新等待輸入。value屬性可省略,省略後預設值為Reset。
- type="submit" value="xxx":將表單資料傳至後端。value屬性可省略,省略後預設值為Submit Query。
- type="image" src="某圖形":將表單資料及滑鼠的位置傳至後端。設input的name值為N,滑鼠位置為x,y,傳回值為N.x=…&N.y=…。
- textarea:文字區。以rows和cols屬性定區塊大小。
三、URL編碼:
瀏覽器會對傳遞資料進行URL編碼,一方面將資料編成key1=value1&key1=value1…等格式,另一方面將所有的特殊字元編成%num,其中num是ASC碼。
拾壹、Cookie
由遠端機器留在近端機器的資料,只包含一個識別元(如ID)、一個值、其他資訊的檔案,指定那些伺服器可以讀取它,以及它什麼時候會失效。
Netscape將cookie存在cookies.txt中,IE則存於cookies目錄下的不同檔案。cookie資料不能大於4k,太多筆時舊的cookie會刪掉。
一、建立cookie的三種方法:
- 在HTTP回應中送Set-Cookie:指令。
- 如瀏覽器支援JavaScript,用document.cookie()函數。
- 在HTML中用meta標籤,也可設定cookie。
二、欄位:
Set-Cookie:key=value; expire=date; path=dirpath; domain=domain; secure
- key=value代表cookie的名稱和值。
- expire=date指定能存在多久,日期到就刪掉。格式為星期幾,日-月-年 時:分:秒 GMT。月是用英文三個字母縮寫,GMT代表格林威治標準時間(Greenwich Mean Time)。如果不指定日期,cookie在使用者離開瀏覽器時就刪掉。
- path=dirpath指示cookie要應用在伺服器的那一個路徑上,通常設為/,即根目錄。
- domain=domain指cookie要傳回那一個網域。可以指定到機器如shop.osborne.com或網域名如.osborne.com,後者時網域中的每一部機器都可以讀、刪、改這個cookie。
- secure只有在安全的伺服器上才傳cookie,避免在不安全的連接埠上傳送cookie。