Perl

貳、純量

一、數字

  1. 正負整數:435,小數(浮點)。
  2. 科學符號:5e20。
  3. 十六進位:0x55ff。
  4. 八進位:0435。

二、字串

  1. 字串長度由0至全部可用記憶體。

(一)單引號字串:

  1. 變數名當成普通字串,不代入變數值。
  2. 以\代表反斜字元,以\\代表一個反斜。
  3. 以\'代表'字元。

(二)雙引號字串:

  1. 變數名以變數值代入。
  2. \a:bell
  3. \b:倒退
  4. \c任意字元:Ctrl-任意字元
  5. \e:ESC
  6. \f:換頁
  7. \l:下一個字元小寫
  8. \b:換行
  9. \r:RETURN
  10. \t:定位字元TAB
  11. \u:下一個字元大寫
  12. \x:輸入十六進位數字
  13. \v:水平定位
  14. \\:反斜
  15. \":雙引號
  16. \:輸入八進位數字
  17. \L:以下小寫直到\E為止
  18. \U:以下大寫直到\E為止
  19. \Q:將所有的特殊字元加上反斜線,直到\E為止
  20. \E:結束之前的\L、\U或\Q

三、算符

  1. 指數(**):A**B,A的B次方。
  2. 字串比較算符:lt,gt,le,ge,eq,ne,cmp,比ASCII碼大小,第一字元如相同比第二字元。數字字串和數字不同,"345"小於"62",但345大於62。
  3. 字串連結算符(.):字串一.字串二.字串三…。
  4. 字串重複算符(x):字串一x次數。
  5. 字串大小寫算符:lc 字串 為字串全部變小寫;lcfirst 字串 為字串第一個字每變小寫;uc 字串 為字串全部變大寫;ucfirst 字串 為字串第一個字每變大寫。
  6. 字串刪除尾部:chop 字串 刪字串最後一個字元;chomp 字串 刪字串最後的換行字元。
  7. 算符的優先順序(P2-31)。
  8. 型別轉換:字串被數值算符處理時,所有的非數字會被刪除,餘下的做計算。數字被lt處理時,會被比較ASCII大小。

五、串列

  1. ( , , …):由獨立的純量所構成,可以包含數字和字串,元素個數沒有限制。
  2. 串列不一定要有名字,但陣列和雜湊都是有名字的串列。
  3. ():空串列
  4. 以範圍指定串列值;(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)。
  5. qw(quote word):將句子以空白裁成串列。如qw(Bill Ted Jack Jill)為("Bill","Ted","Jack","Jill")
  6. ($變數名1,$變數名2,$變數名3…)=@陣列名;
  7. ($變數名1,$變數名2,$變數名3…)=@_;
  8. 將某個不存在的陣列元素指給變數時,變數值設為null。

參、常規表示式(regular expression)

  1. /常規式/
  2. 字串=~/常規式/;找到傳回真
  3. 字串!~/常規式/;找到傳回偽
  4. =~/SR+/;SR,SRR,SRRR,SRRRR…都算,而且取R最多的那一個。也可用=~/SR+T/;
  5. =~/gr*eat/;r出現0或多次都算,即geat也算,並取r最多者。
  6. =~/gr?eat/;r出現0或一次都算,即只geat和great兩個算。
  7. =~/gr{3,6}eat/;r出現3-6次都算。也可用{0,5}(0-5次),{2,}至少兩次,{2}正好兩次。
  8. =~/a.t/;a和t之間放任何一個字元都算合,除了\n以外。
  9. =~/200[0123456789]/;2000-2009都合。
  10. =~/I am yelling[.!]/;句末不論是.或!都合。也可用[0-9]和[a-z]…
  11. 在常規式中要用+、*、?、.、[、]、\等字元,字元前要加\。
  12. =~/\beat/;找eat且eat須在字的開頭。
  13. =~/eat\b/;找eat且eat須在字的尾端。
  14. =~/\beat\b/;只有eat是字串中的一個字時才合。
  15. \B和\b相反,表示必須有其他字元相連(不算和空白相連)才合
  16. =~/^eat/;eat必須在整個字串的最前
  17. =~/eat$/;eat必須在整個字串的最後
  18. \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]即非空白。
  19. =~/2000|2001/;找2000或2001
  20. 在常規式/…/間加(),每一組被找到的常規式被儲存起來,由左到右每一組用1,2,3…表示。即找到的第一組()存起來用1表示,找到的第二組()存起來用2表示。
  21. 如"this-is-an-example=~/([a-z]+)(-)\1\2\1/;找連續小寫字當作1,找hyphen當作2,整個找"連續小寫字hyphen連續小寫字hyphen連續小寫字"。
  22. 承上二項,找到的第一組常規式存入$1,第二組常規式存入$2。
  23. 如/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/,找%後跟著兩個字元,找到把這兩個字元存起來,後面的$1即代表前面儲存起來的這兩個字元。
  24. 前一個成功比對的樣式存入$&。
  25. 優先順序:+,*,?,{},^,$,\b,\B,|
  26. 常規式/…/後接字元:i忽略大小寫;g找出所有成功比對樣式,但只有存入陣列或使用迴圈時才會發生作用;o常規式只被運算一次,即被固定下來。p7-27
  27. 字串=~s/被換/換成/; 字串的內容會被改變。/…/…/後接字元:i忽略大小寫;g所有成功比對的都換;e常規式以運算看待,如9*9沒e時視為"9*9",有e時視為"81"。
  28. 字串=~tr/被換/換成/;例如:字串=~tr/thed/abc/;字串中所有的t換成a,所有h換成b,所有e換成c,所有d換成c,不必加g即會全部都換。
  29. 字串=~tr/常規式/換成/c;除了合常規式以外都換。如字串=~tr/a-z/\t/c;除了小寫字元外全部字元換成TAB字元。
  30. 字串=~tr/a-z //d;除了小寫字元及其隨後之空白外,其他字元全刪。
  31. $value =~ s/\+/ /g;把+號換成空白
  32. $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;把特殊字元依ASC碼換成字符。
  33. pack()可以用在///的後段當作要換上的東西,不能放在前段當作要找的東西。

肆、控制結構

四、foreach

  1. foreach $變數名 (@陣列名) {把陣列中每一個元素,拿來代入變數名做一次}
  2. @num3=("一","二","三","四","五");foreach $num (@num3) {print $num."<br>";}
  3. foreach (@陣列名) {把陣列中每一個元素,拿來代入$_,各做一次}

伍、檔案

  1. open (filehandle,"檔名");讀檔,有時可配合@陣列名=<某個filehandle>;取出資料
  2. open (filehandle,">檔名");將檔案內容清空以覆寫檔案,要配合print 某個filehandle " ";寫入新資料
  3. open (filehandle,">>檔名");加到檔尾
  4. open (filehandle,"+<檔名");檔案開在讀取寫入模式,不會傷到檔案內容。
  5. open (filehandle,"|程式 參數");
  6. close (filehandle);關檔,將filehandle釋放還給系統
  7. @陣列名=<filehandle>;檔案中的每一行存成陣列中的一個元素。
  8. $某變數=<filehandle>;while($某變數){print "$某變數\n";$某變數=<filehandle>;}:輸出檔案中的每一行的內容。
  9. read(檔案代碼,$變數名,長度,從檔頭算跳過多少byte);檔案代碼即filehandle。每一次read是添附新的部分到變數來,不是蓋掉變數原有的內容。p6-11
  10. tell(檔案代碼);目前位置距檔頭多遠。
  11. seek(檔案代碼,長度,參數);參數為0表從檔頭算起,參數為1表從目前的位置算起,參數為2表從檔尾算起,
  12. binmode(檔案代碼);以二元檔格式處理。
  13. <STDIN><STDOUT>不必開關。
  14. <STDIN>視為一陣列,其值一行行存於@_。
  15. open (STDOUT,">檔名");標準輸出重新導向,所有print由螢幕轉向檔案。
  16. rename("舊檔名","新檔名);
  17. unlink("檔名");永久刪除檔案
  18. chmod(mode,"檔名);改變屬性
  19. 檔案測試:p6-22。如if(-e 檔名){…}。-e檔名是否存在;-M上次修改到現在的時間;-r檔名是否可被讀取;-z是否空檔…。
  20. mkdir("目錄名",mode);
  21. chdir("目錄名");
  22. opendir(目錄代碼,"目錄名");開目錄以便讀取
  23. closedir(目錄代碼);關目錄
  24. readdir(目錄代碼);傳回目錄的第一個檔案或子目錄,可用迴圈讀全部。
  25. telldir(目錄代碼);傳回目錄清單的位置
  26. rewindir(目錄代碼);重回目錄清單開頭
  27. rmdir("目錄名");刪目錄

陸、副程式

  1. 定義副程式:sub 副程式名 {}
  2. 叫用副程式:
    1. &副程式名:既不傳入也不傳出副程式。
    2. &副程式名(參數1,參數2…):傳入參數並執行副程式。
    3. $變數名=副程式名(參數1,參數2…):傳入參數,並傳回結果。
  3. 參數傳入副程式,放入 @_陣列。
  4. return 傳回值;
  5. 不用return結束副程式,傳回最後一個敘述的計算結果。
  6. 載入副程式:require "含副程式之檔名";或use 檔名;
  7. 被載入含副程式之檔,檔末(不是副程式末)要加return true;
  8. 用local…;定義本地變數,只在副程式內有效,返還母程式時釋出。local定義的變數,其下階巢狀副程式可以引用。
  9. 用my…;也可定義本地變數,且其下階巢狀副程式不可以引用。
  10. 進一步參看p5-21、p5-29。

捌、特別變數

一、環境變數:以cgi(tenv.cgi)遠端查Cobalt_Qube

  1. $ENV{'REMOTE_ADDR'} 是使用者的 IP: 211.74.14.35
  2. $ENV{'HTTP_USER_AGENT'} 是使用者的基本作業環境: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
  3. SERVER_SOFTWARE = Apache/1.3.3 Cobalt (Unix) (Red Hat/Linux)
  4. GATEWAY_INTERFACE = CGI/1.1
  5. DOCUMENT_ROOT = /home/groups/home
  6. REQUEST_METHOD = GET
  7. QUERY_STRING =
  8. HTTP_ACCEPT = application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
  9. REMOTE_PORT = 2292
  10. HTTP_ACCEPT_LANGUAGE = zh-tw
  11. REDIRECT_UNIQUE_ID = OyyCmMCoAKoAADhpqjA
  12. HTTP_ACCEPT_ENCODING = gzip, deflate
  13. REDIRECT_STATUS = 200
  14. SCRIPT_FILENAME = /usr/cgiwrap/cgiwrap
  15. SERVER_NAME = www.jendo.org
  16. SERVER_PORT = 80
  17. PATH_TRANSLATED = /home/groups/home/tenv.cgi
  18. SERVER_ADMIN = admin@www.jendo.org
  19. UNIQUE_ID = OyyCmMCoAKoAADhpqjA
  20. REDIRECT_URL = /tenv.cgi
  21. SCRIPT_URI = http://www.jendo.org/tenv.cgi
  22. SCRIPT_URL = /tenv.cgi
  23. SERVER_SIGNATURE =
  24. SERVER_PROTOCOL = HTTP/1.1
  25. HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
  26. PATH = /sbin:/usr/sbin:/bin:/usr/bin
  27. HTTP_CONNECTION = Keep-Alive
  28. REDIRECT_SCRIPT_URI = http://www.jendo.org/tenv.cgi
  29. SCRIPT_NAME = /groups/home/tenv.cgi
  30. REDIRECT_SCRIPT_URL = /tenv.cgi
  31. REQUEST_URI = /tenv.cgi
  32. PATH_INFO =
  33. HTTP_HOST = www.jendo.org

二、暫存陣列@_:

  1. foreach省略變數名時,陣列中各元素代中$_各做一次。foreach (@陣列名) {…;}
  2. 叫用副程式時,母程式以參數傳入@_,交給副程式。副程式中可以用…=@_;取出使用。
  3. <STDIN>視為一陣列,其值一行行存於@_。

玖、動詞

  1. @陣列名=split(/字串/,$變數名);把變數在字串處切成數段,各段存入陣列中。
  2. @pairs = split(/&/,$finfo);
  3. ($name,$value) = split(/=/,$pair);把$pair在=處切成兩段,前段為$name,後段為$value
  4. read(filehandle,$變數名,長度);把檔案內容給變數並設定變數長度,如read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  5. localtime(秒數),將秒數換算成秒、分、時、日、月、年,放入@_。其中年自1900年算起,月份需加一。因三個月零八天就已經邁入四月了。

拾、表單(Form)

傳東西給cgi

一、Form的屬性:

  1. action=CGI程式的位置。可以省略,瀏覽器會把此表單交給提供這個表單的主機。所以我們可以建立一個提交給其他主機的表單,但這樣子做在大部分的瀏覽器會得到警告訊息。
  2. method=get 或 post。優先用post,不經URL傳遞,不限傳遞資料的長度。get是預設值,將表單資料附在實際程式的URL之後,URL可能太長,導致超過系統允許的長度,而被截短導致錯誤。
  3. enctype交代資料型態。最常用enctype=application/x-www-form-urlencoded。
用get時,可用QUERY_STRING環境變數來取得,其他人也可以透過這個環境變數取得傳遞資料。
兩者方法都可以用CONTENT_LENGTH環境變數來查傳遞資料的長度,進一步提取資料到變數。

二、內含標籤:

select、input、textarea皆可用name屬性對其資料命名,變成資料名=輸入的資料,然後送往STDIN。
  1. select夾OPTION。以size屬性決定顯示列數。各OPTION以value指定name要對應的值。選那一個傳回那一個值。
  2. select 可加multiple屬性,讓之後的OPTION可以複選。
  3. input的各種型態:
    1. type="text":文字。由使用者輸入其值。以size屬性,maxlength屬性,定輸入框及輸入字串的寬度。
    2. type="password":同文字,只是字元不顯出來。
    3. type="checkbox" value="xxx":核取盒。每一個個核取項目要有一個input標籤。
    4. type="radio" value="xxx":同一組選項中僅選一個。同組中每一選項有一個input標籤,但其name屬性皆相同。
    5. type="hidden" value="xxx":直接傳值給後端,不必有任何顯示及動作。
    6. type="reset" value="xxx":不傳資料至後端,只是清空前端的表單重新等待輸入。value屬性可省略,省略後預設值為Reset。
    7. type="submit" value="xxx":將表單資料傳至後端。value屬性可省略,省略後預設值為Submit Query。
    8. type="image" src="某圖形":將表單資料及滑鼠的位置傳至後端。設input的name值為N,滑鼠位置為x,y,傳回值為N.x=…&N.y=…。
  4. textarea:文字區。以rows和cols屬性定區塊大小。

三、URL編碼:

瀏覽器會對傳遞資料進行URL編碼,一方面將資料編成key1=value1&key1=value1…等格式,另一方面將所有的特殊字元編成%num,其中num是ASC碼。

拾壹、Cookie

由遠端機器留在近端機器的資料,只包含一個識別元(如ID)、一個值、其他資訊的檔案,指定那些伺服器可以讀取它,以及它什麼時候會失效。
Netscape將cookie存在cookies.txt中,IE則存於cookies目錄下的不同檔案。cookie資料不能大於4k,太多筆時舊的cookie會刪掉。

一、建立cookie的三種方法:

  1. 在HTTP回應中送Set-Cookie:指令。
  2. 如瀏覽器支援JavaScript,用document.cookie()函數。
  3. 在HTML中用meta標籤,也可設定cookie。

二、欄位:

Set-Cookie:key=value; expire=date; path=dirpath; domain=domain; secure
  1. key=value代表cookie的名稱和值。
  2. expire=date指定能存在多久,日期到就刪掉。格式為星期幾,日-月-年 時:分:秒 GMT。月是用英文三個字母縮寫,GMT代表格林威治標準時間(Greenwich Mean Time)。如果不指定日期,cookie在使用者離開瀏覽器時就刪掉。
  3. path=dirpath指示cookie要應用在伺服器的那一個路徑上,通常設為/,即根目錄。
  4. domain=domain指cookie要傳回那一個網域。可以指定到機器如shop.osborne.com或網域名如.osborne.com,後者時網域中的每一部機器都可以讀、刪、改這個cookie。
  5. secure只有在安全的伺服器上才傳cookie,避免在不安全的連接埠上傳送cookie。