(接上篇)
-------------------
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 如果请求不被执行。
(未完待续)