Lua4.0 参考手册(八)6.2-6.5

(接上篇)
-------------------
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

相关文章
相关标签/搜索