(接上篇)
-------------------
6.2 字符串處理
-------------------
這個庫提供字符串處理的通用函數,如查找,提取子串和模式匹配。在 Lua 中索引一個字符串的時候,第一個字符的索引是 1(不像 C 中是 0)。另外,索引能夠爲負數,負數被解釋爲逆向索引,從字符串的結尾開始。因此,最後一個字符位置是 -1,以此類推。
strbyte (s [, i])
返回 s 的第 i 個字符的內部數值碼(例如:ASCII 碼)。若是沒有 i,它被認爲是 1 。i 能夠爲負。
數值碼在不一樣的平臺沒必要兼容。
strchar (i1, i2, ...)
接受 0 個或者更多整數。返回一個字符串,長度和參數的個數相等,字符串中的每一個字符的內部數值碼(例如:ASCII 碼)等於相應的參數。
數值碼在不一樣的平臺沒必要兼容。
strfind (s, pattern [, init [, plain]])
查找模式在 s 中第一次匹配。若是找到,strfind 返回這個匹配在 s 的開始結束索引;不然,返回 nil 。若是模式指定捕獲(capture)(參見下面的 gsub),被捕獲的字符串作爲額外的結果返回。第三個可選的數字型參數指定從哪裏開始檢索;它的默認值爲 1 ,而且可爲負數。第四個可選參數 plain 爲 1 時關閉模式匹配功能,函數只作一個簡單的查找子串的操做,pattern 裏不可沒值。
strlen (s)
接受一個字符串返回它的長度。空字符串 "" 的長度爲 0 。內嵌的 0 也被計數,因此 "a\000b\000c" 的長度爲 5 。
strlower (s)
接受一個字符串,返回它的全部大寫字母都轉化爲小寫的拷貝。其它的字符保持不變。大寫字母的定義依賴於當前的區域設置。
strrep (s, n)
返回一個字符串,該字符串是當前字符串 s 的 n 次拷貝的鏈接。
strsub (s, i [, j])
返回另外一個字符串,它是 s 的子串,始於 i 終於 j ; i 和 j 能夠爲負數,若是 j 不指定,它被假定爲 -1 (就是字符串的長度)。特別地,strsub(s,1,j) 調用返回 s 的 j 個字符的前綴,strsub(s, -i) 返回 s 的長度爲 i 的後綴。
strupper (s)
接受一個字符串,返回它的全部小寫字母都轉化爲大寫的拷貝。其它的字符保持不變。小寫字母的定義依賴於當前的區域設置。
format (formatstring, e1, e2, ...)
返回一個可變參數的格式化字符串,根據它的第一個參數描述(它必須是一個字符串)。格式字符串和標準 C 函數的 printf 族的規則同樣。惟一不一樣的是選項/修飾符 *, l, L, n, p, 和 h 不支持,而且它還有一個額外的選擇 q 。這個選項以一個合適的格式格式化一個字符串,該格式能夠被 Lua 解釋器安全的讀回:寫在雙引號中的字符串,和全部的雙引號,換行和反斜線均可以在寫出時被正確的轉義。
選項 c,d,E,e,f,g,i,o,u,X 和 x 都須要一個數值參數,q 和 s 須要一個字符串。例如,調用
format('%q', 'a string with "quotes" and \n new line')
將生成字符串:
"a string with \"quotes\" and \
new line"
轉化能夠應用於參數列表裏的第 n 個參數,而不是下一個未使用的參數。在這種狀況下,轉化字符 % 被替換爲序列 %d$,這裏 d 是一個在 [1,9] 範圍以內的十進制數,給定參數在參數列表中的位置。例如,調用 ("%2$d -> %1$03d", 1, 34) 的結果爲 "34 -> 001"。一樣的參數能夠屢次用於轉化中。
選項 c, d, E, e, f, g, G, i, o, u, X, 和 x 都指望一個數字作爲參數,而 q 和 s 都指望一個字符串。* 修飾符能夠經過創建適當的格式字符串來模擬。例如,"%*g" 能夠由 "%"..width.."g" 來模擬。
格式化字符串或者將要被 %s 格式化的字符串值都不能夠包含內嵌的 0 。%q 可處理內嵌 0 的字符串值。
gsub (s, pat, repl [, n])
返回一個 s 的拷貝,在拷貝中全部的模式 pat 出現的地方都被替換爲一個由 repl 指定的字符串。總共替換的次數作爲 gsub 返回的第二個值。
若是 repl 是一個字符串,那麼它的值被用做替換用字符串。任意在 repl 中的形如 %n (n 在 1 到 9 之間)的序列表明第 n 個被捕獲的子串的值。
若是 repl 是一個函數,那麼這個函數會在每次一個匹配發生時被調用,全部被捕獲的子串按順序作爲參數傳遞給它(參見下面)。若是這個函數返回的值是一個字符串,那麼它被用作替換用字符串;不然,替換字符串爲空符串。
最後,可選參數 n 限定了替換髮生的最大次數。例如,當 n 爲 1 時只有第一次出現的 pat 會被替換。
這裏是一些例子:
x = gsub("hello world", "(%w+)", "%1 %1")
--> x="hello hello world world"
x = gsub("hello world", "(%w+)", "%1 %1", 1) --> x="hello hello world"
x = gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") --> x="world hello Lua from"
x = gsub("home = $HOME, user = $USER", "%$(%w+)", getenv) --> x="home = /home/roberto, user = roberto" (for instance)
x = gsub("4+5 = $return 4+5$", "%$(.-)%$", dostring) --> x="4+5 = 9"
local t = {name="lua", version="4.0"} x = gsub("$name - $version", "%$(%w+)", function (v) return %t[v] end) --> x="lua - 4.0"
t = {n=0} gsub("first second word", "(%w+)", function (w) tinsert(%t, w) end) --> t={"first", "second", "word"; n=3}
模式
字符集:
一個字符集用來表示一個字符的集體。下面的組合可用來描述一個字符集:
x
(這裏 x 是任意魔法字符 ^$()%.[]*+-?) - 表明字符 x 它本身。
.
- (一個點) 表明全部的字符。
%a
- 表明全部字母。
%c
- 表明全部控制字符。
%d
- 表明全部數字。
%l
- 表明全部小寫字母。
%p
- 表明全部標點字符。
%s
- 表明全部空白字符。
%u
- 表明全部大寫字母。
%w
- 表明全部字母數字字符。
%x
- 表明全部十六進制數字。
%z
- 表明表示 0 的字符。
%x
(這裏 x 是非字母數字字符) - 表明字符 x. 這是避開魔法字符的標準方法。咱們建議任何標點字符(即便是非魔法的)以 % 爲前導字符當它在模式中表示它本身時。
[char-set]
- 表明全部 char-set 中的字符的聯合。一個字符範圍能夠由用一個 - 分割範圍的結束字符指定。全部的上面描述的 %x 集合也能夠用來做爲一個 char-set 的組成部分。全部其它的 char-set 中的字符表明它們本身。例如,[%w_] (或 [_%w]) 表明全部的字母數字字符加上一個下劃線,[0-7] 表明八進制數字,[0-7%l%-] 表明八進制字符加上小寫字母加上一個中劃線 - 字符。
範圍和集合的相互做用沒有定義。因此,模式像 [%a-z] 或 [a-%%] 沒有意義。
[^char-set]
- 表明 char-set 的補集,這裏的 char-set 的解釋如上所述。
對於全部的由單個字符表明的集合(%a, %c, ...),相應的大寫字母表明它的補集。例如,%S 表明全部的非空白字符。
字母,空間等的定義依賴於當前的區域設置。特別的,集合 [a-z] 可能不等於 %l 。對於可移植性來講,應首選第二種形式。
模式元素:
一個模式能夠是
> 一個字符集合,它匹配任意的集合中的單個字符;
> 一個字符集合後跟 * ,它匹配 0 次或者屢次集合中的字符的出現。這個重複出現元素老是匹配最長的序列;
> 一個字符集合後跟 + ,它匹配 1 次或者屢次集合中的字符的出現。這個重複出現元素老是匹配最長的序列;
> 一個字符集合後跟 - ,它也是匹配 0 次或者屢次集合中的字符的出現。不一樣於 * ,這個重複出現元素匹配最短的可能序列;
> 一個字符集合後跟 ? ,它匹配 0 或者 1 次集合中的字符。
> %n, n 從 1 到 9;這個元素匹配一個子串等於第 n 個被捕獲的字符串(參見下面);
> %bxy,這裏 x 和 y 是兩個不一樣的字符;這樣的元素匹配字符串以 x 爲開頭,以 y 爲結尾,而且 x 和 y 是平衡的。這意味着,若是你從左到右讀這個字符串,遇到 x 計數 +1 ,遇到 y 計數 -1,結尾的 y 是使計數爲 0 的第一個 y 。例如,元素 %b() 匹配圓括號平衡的表達式。
模式:
一個模式是一個模式元素的序列。一個 ^ 開頭的模式肯定目標字符串從開頭匹配。一個 $ 結尾的模式肯定目標字符串的結尾匹配。在其它位置,^ 和 $ 沒有特殊的意思而且只表示他們本身。
捕獲:
一個模式能夠包含括在括號裏的子模式,他們描述了捕獲。當一個匹配成功了,匹配了的目標字符串的子串捕獲被保存以備未來使用。捕獲以它們的左括號編號。例如,在模式 "(a*(.)%w(%s*))",匹配 "a*(.)%w(%s*)" 的字符串部分被保存爲第一個捕獲(所以它的編號爲 1);字符 . 被捕獲編號爲 2, %s* 部分的編號爲 3 。
一個模式不能夠包含內嵌的 0 。用 %z 來代替。
(多是因爲本身對於模式部分不太瞭解,這部分翻譯的比較亂,特別是對於有 capture 相關的。由於有的英文說法很差用同等意思的中文替換,有須要的仍是參考英文原文吧。)
-------------------
6.3 數學函數
-------------------
這個庫是到一些標準 C 數學函數庫函數的一個接口。並且,它爲二元冪操做符 ^ 註冊了一個標籤方法,當它應用於 x^y時,返回 x的 y次冪。
它提供瞭如下的函數:
abs acos asin atan atan2 ceil cos deg exp floor log log10
max min mod rad sin sqrt tan frexp ldexp random randomseed
還有一個全局變量 PI。它們中的絕大部分只是 C 函數庫中同名函數的接口,不一樣之處是,在三角函數中,全部的角度是由角度表示,而不是弧度。函數 deg 和 rad 能夠用來在弧度和角度之間轉換。
函數 max 返回數字參數列表中的最大值,相似的,min 返回最小值。它們均可以使用 1 個, 2 個或者多個參數。
函數 random 和 randomseed 是到 ANSI C 提供的隨機數生成器函數 rand 和 srand 的接口。(不保證它們的統計學屬性。)函數 random ,無參調用時,返回一個 返回在[0,1) 區間的僞隨機實數。當以一個數字 n 調用時,random 返回一個在[1,n] 區間的僞隨機整數。當以兩個參數 l 和 u 調用它時,random 返回一個在 [l,u] 區間的僞隨機整數。
-------------------
6.4 I/O
-------------------
這些句柄被保存在 Lua 的兩個全局變量中,叫作 _INPUT 和 _OUTPUT。全局變量 _STDIN, _STDOUT, 和 _STDERR 被初始化爲文件描述符 stdin, stdout, 和 stderr。最初,_INPUT=_STDIN 且 _OUTPUT=_STDOUT。
一個文件句柄是一個包含文件流(FILE*)的 userdata ,它有一個由 I/O 庫生成的獨特的標籤。
不像其它的規定,全部的 I/O 函數失敗時返回 nil ,成功時返回其它的不一樣於 nil 的值。
openfile (filename, mode)
打開文件,由字符串 mode 指定打開模式。它返回一個新的文件句柄,或者,在出錯的狀況下,返回 nil 加上一個描述錯誤的字符串。這個函數不修改 _INPUT 或者 _OUTPUT 。
表示模式找字符串能夠是下列之一:
``r''
讀模式;
``w''
模式;
``a''
追加模式;
``r+''
更新模式,全部以前的數據保留;
``w+''
更新模式,全部以前的數據被清除;
``a+''
追加更新模式,全部以前的數據保留,只容許在文件的結尾寫。
模式字符串也能夠後加一個 b ,爲了在一些系統中用以加開二進制文件。這個字符串正是用標準 C 函數 fopen 。
closefile (handle)
關閉給定的文件。它不修改 _INPUT 或者 _OUTPUT 。
readfrom (filename)
這個函數能夠以兩種方法調用 。當以一個文件名調用時,它打開給定的文件,把它的句柄設置給 _INPUT,並返回它的值。它不關閉當前的輸入文件。當無參調用時,它關閉 _INPUT 文件,並恢復 _INPUT 爲標準輸入。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
若是文件名以一個豎線 | 開始,那麼打開一個輸入管道,經過函數 popen。並不是全部的系統都實現了管道。此外,同時能夠打開的文件數一般也是有限制的而且依賴於系統。
writeto (filename)
這個函數能夠以兩種方法調用 。當以一個文件名調用時,它打開給定的文件,把它的句柄設置給 _OUTPUT,並返回它的值。它不關閉當前的輸出文件。注意,若是文件已經存在,它將會這個操做徹底清除。當無參調用時,它關閉 _OUTPUT 文件,並恢復 _OUTPUT 爲標準輸出。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
若是文件名以一個豎線 | 開始,那麼打開一個輸入管道,經過函數 popen。並不是全部的系統都實現了管道。此外,同時能夠打開的文件數一般也是有限制的而且依賴於系統。
appendto (filename)
打開一個名爲 filename 的文件而且把它設置爲 _OUTPUT。不像 writeto 操做,這個函數不會清除文件以前的內容;反而,全部的寫給文件的內容追加到文件末尾。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
remove (filename)
刪除給定名字的文件。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
rename(name1, name2)
把文件名從 name1 改成 name2。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
flush ([filehandle])
保存全部的已寫的數據到給定文件。若是 filehandle 沒有指定,它將刷新全部的打開的文件。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
seek (filehandle [, whence] [, offset])
設置和獲取文件的位置,從文件的起始處開始單位爲字節,以指定的字符串 whence 爲基點,到給定位置爲 offset 的地方,以下所示:
``set''
以位置 0 爲基點 (文件的起始處);
``cur''
以當前位置爲基點;
``end''
以文件尾爲基點;
在成功的狀況下,函數 seek 返回最終的文件位置,從文件的起始處開始單位爲字節。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
whence 的默認值爲 "cur",offset 的默認值爲 0 。所以,調用 seek(file) 返回文件的當前位置,並不改變它;調用 seek(file, "set") 設置位置到文件的起始處(而且返回 0 );調用 seek(file, "end") 設置位置到文件的結尾處,而且返回它的尺寸。
tmpname()
返回一個文件名字符串,它能夠安全地用作臨時文件名。文件在使用前必須顯式打開,在不使用時要移除。
read ([filehandle,] format1, ...)
讀文件 _INPUT,或者 filehandle 若是參數給定的話,根據給定的格式,格式指定了讀什麼。對於每個格式,函數返回一個字符串(或者一個數字),或者 nil 若是對於指定格式不能讀取數據。當不使用格式調用時,它使用一個默認的格式來讀取下一行(參見下面)。
可用的格式是
``*n''
讀一個數字;這是惟一的返回數字而非字符串的格式。
``*l''
讀下一行(跳過行尾),或者 nil 在文件的末尾。這是默認的格式。
``*a''
讀取整個文件,從當前的位置。在文件的末尾,返回空字符串。
``*w''
讀取下一個單詞(最大的非空白字符序列),若是須要的話跳過空白,或者 nil 在文件的末尾。
number
讀取一個由 number 個字符的字符串,或者 nil 在文件的末尾。
write ([filehandle, ] value1, ...)
寫每個參數的值到 文件 _OUTPUT,或者 filehandle 若是參數給了。參數必須是字符串或者數字。可使用 tostring 或者 format 在 write 以前來寫其它值。若是這個函數失敗,它返回 nil 和一個描述錯誤的字符串。
-------------------
6.5 系統功能
-------------------
clock ()
返回程序使用的 CPU 總時間的近似值,單位是秒。
date ([format])
返回一個字符串包含日期和時間,格式由給定的字符串 format 指定,和 ANSI C 函數 strftime 的規則同樣。當無參調用時,它返回一個合理的日期和時間表示,依賴於宿主程序和當前的區域設置。
execute (command)
這個函數和 C 函數 system 是等價的。它把被執行的 command 傳遞給操做系統 shell。它返回一個狀態碼,狀態碼系統相關。
exit ([code])
調用 C 函數 exit,以一個可選的 code,以終止程序。code 的默認值是成功的狀態碼。
getenv (varname)
返回進程的環境變量 varname 的值,或者 nil 若是變量沒有定義的話。
setlocale (locale [, category])
它是一個到 ANSI C 函數 setlocale 的接口。locale 是一個字符串指定了一個區域;category 是一個可選的字符串描述了將要改變的種類: "all", "collate", "ctype", "monetary", "numeric", 或者 "time";默認的 category 是 「all"。函數返回新的區域設置的名字,或者 nil 若是請求不被執行。
(未完待續)shell