复习一遍云风大佬的Lua 5.3参考手册 中标准库内容
6.0独立版Lua
arg
lua 会将所有命令行传入的参数放到一张全局表 arg 中。 脚本的名字放在索引 0 的地方, 脚本名后紧跟的第一个参数在索引 1 处,依次类推。 在脚本名前面的任何参数 (即解释器的名字以及各选项) 放在负索引处。
6.1基础函数
next(table,[,index])
特别指出,你可以用 next(t) 来判断一张表是否是空的。
索引在遍历过程中的次序无定义, 即使是数字索引也是这样。 (如果想按数字次序遍历表,可以使用数字形式的 for 。)
select(index,...)
如果 index 是个数字, 那么返回参数中第 index 个之后的部分; 负的数字会从后向前索引(-1 指最后一个参数)。 否则,index 必须是字符串 "#", 此时 select 返回参数的个数。
6.3模块
pack.config
一个描述有一些为包管理准备的编译期配置信息的串。 这个字符串由一系列行构成:
第一行是目录分割串。 对于 Windows 默认是 '' ,对于其它系统是 '/' 。
第二行是用于路径中的分割符。默认值是 ';' 。
第三行是用于标记模板替换点的字符串。 默认是 '?' 。
第四行是在 Windows 中将被替换成执行程序所在目录的路径的字符串。 默认是 '!' 。
第五行是一个记号,该记号之后的所有文本将在构建 luaopen_ 函数名时被忽略掉。 默认是 '-'。
使用:在不同系统上返回目录分割符`string.sub(pack.config,1,1)`
6.4字符串处理
string.find (s, pattern [, init [, plain]])
可选参数 plain 为 true 时, 关闭模式匹配机制。 此时函数仅做直接的 “查找子串”的操作, 而 pattern 中没有字符被看作魔法字符。 注意,如果给定了 plain ,就必须写上 init 。
如果在模式中定义了捕获,捕获到的若干值也会在两个索引之后返回。
string.gsub (s, pattern, repl [, n])
如果 repl 是一个字符串,那么把这个字符串作为替换品。 字符 % 是一个转义符: repl 中的所有形式为 %d 的串表示 第 d 个捕获到的子串,d 可以是 1 到 9 。 串 %0 表示整个匹配。 串 %% 表示单个 %。
如果 repl 是张表,每次匹配时都会用第一个捕获物作为键去查这张表。
如果 repl 是个函数,则在每次匹配发生时都会调用这个函数。 所有捕获到的子串依次作为参数传入。
string.len (s)
接收一个字符串,返回其长度。 空串 "" 的长度为 0 。 内嵌零也统计在内,因此 "a 00bc 00" 的长度为 5
string.rep (s, n [, sep])
返回 n 个字符串 s 以字符串 sep 为分割符连在一起的字符串。 默认的 sep 值为空字符串(即没有分割符)。 如果 n 不是正数则返回空串。
6.4.1 匹配模式
Lua 中的匹配模式直接用常规的字符串来描述。 它用于模式匹配函数 string.find, string.gmatch, string.gsub, string.match。 这一节表述了这些字符串的语法及含义(即它能匹配到什么)。
字符类:
字符类 用于表示一个字符集合。 下列组合可用于字符类:
-
x: (这里 x 不能是 魔法字符 ^$()%.[]*+-? 中的一员) 表示字符 x 自身。
-
.: (一个点)可表示任何字符。
-
%a:表示任何字母。(alphabet)
-
%c: 表示任何控制字符。(control character)
-
%d: 表示任何数字。(decimal)
-
%g: 表示任何除空白符外的可打印字符。
-
%l: 表示所有小写字母。(lowercase)
-
%p: 表示所有标点符号。(punctuation)
-
%s: 表示所有空白字符。(space)
-
%u: 表示所有大写字母。(uppercase)
-
%w: 表示所有字母及数字。
-
%x: 表示所有 16 进制数字符号。
-
%z: 表示空字符(' 00')
-
%x: (这里的 x 是任意非字母或数字的字符) 表示字符 x。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 '%' 放在模式串中表示自身。
-
[set]: 表示 set 中所有字符的联合。 可以以 '-' 连接,升序书写范围两端的字符来表示一个范围的字符集。 上面提到的 %x 形式也可以在 set 中使用 表示其中的一个元素。 其它出现在 set 中的字符则代表它们自己。 例如,[%w_] (或 [_%w]) 表示所有的字母数字加下划线), [0-7] 表示 8 进制数字, [0-7%l%-] 表示 8 进制数字加小写字母与 '-' 字符。
交叉使用类和范围的行为未定义。 因此,像 [%a-z] 或 [a-%%] 这样的模式串没有意义。
-
所有单个字母表示的类别(%a,%c,等), 若将其字母改为大写,均表示对应的补集。 例如,%S 表示所有非空格的字符。
如何定义字母、空格、或是其他字符组取决于当前的区域设置。 特别注意:[a-z] 未必等价于 %l 。
模式条目:
模式条目 可以是
-
单个字符类匹配该类别中任意单个字符;
-
单个字符类跟一个 '*', 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串;
-
单个字符类跟一个 '+', 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串;
-
单个字符类跟一个 '-', 将匹配零或更多个该类的字符。 和 '*' 不同, 这个条目总是匹配尽可能短的串;
-
单个字符类跟一个 '?', 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;
-
%n, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
-
%bxy, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。
-
%f[set], 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ' ' 一样。
边界模式含义在于检测从不在集合中到在集合中的过渡来表明匹配范围.
string.gsub ("THE (QUICK) brOWN FOx JUMPS", "%f[%a]%u+%f[%A]", print)
THE
QUICK
JUMPS
模式:
模式 指一个模式条目的序列。 在模式最前面加上符号 '^' 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 '$' 将使匹配过程锚定到字符串的结尾。 如果 '^' 和 '$' 出现在其它位置,它们均没有特殊含义,只表示自身。
捕获:
模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 "(a(.)%w(%s))" , 字符串中匹配到 "a(.)%w(%s)" 的部分保存在第一个捕获物中 (因此是编号 1 ); 由 "." 匹配到的字符是 2 号捕获物, 匹配到 "%s*" 的那部分是 3 号。
作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 "()aa()" 作用到字符串 "flaaap" 上,将产生两个捕获物: 3 和 5 。
6.5 UTF-8支持
utf8.charpattern
用于精确匹配到一个 UTF-8 字节序列的模式(是一个字符串,并非函数)"[ -x7FxC2-xF4][x80-xBF]*" (参见 §6.4.1)。 它假定处理的对象是一个合法的 UTF-8 字符串。
6.6 表处理
table.move (a1, f, e, t [,a2])
将元素从表 a1 移到表 a2。 这个函数做了次等价于后面这个多重赋值的等价操作: a2[t],··· = a1[f],···,a1[e]。 a2 的默认值为 a1。 目标区间可以和源区间重叠。 索引 f 必须是正数。
a1-- 原表
f -- from index
e -- end index
t -- to index
a2 -- 目标表
move 是a1的值复制到a2里面去,并不会移除原来a1里的值.
table.pack (···)
返回用所有参数以键 1,2, 等填充的新表, 并将 "n" 这个域设为参数的总数。 注意这张返回的表不一定是一个序列。
table.pack(nil,2,3,4) -- 返回的就不是序列
table.sort (list [, comp])
排序算法并不稳定; 即当两个元素次序相等时,它们在排序后的相对位置可能会改变。
6.7 数学库
math.modf (x)
返回 x 的整数部分和小数部分。 第二个结果一定是浮点数。
math.type (x)
如果 x 是整数,返回 "integer", 如果它是浮点数,返回 "float", 如果 x 不是数字,返回 nil。
6.8 输入输出库
I/O 库提供了两套不同风格的文件处理接口。 第一种风格使用隐式的文件句柄; 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件。 第二种风格使用显式的文件句柄。
当使用隐式文件句柄时, 所有的操作都由表 io 提供。 若使用显式文件句柄, io.open 会返回一个文件句柄,且所有的操作都由该文件句柄的方法来提供。
表 io 中也提供了三个 和 C 中含义相同的预定义文件句柄: io.stdin, io.stdout, 以及 io.stderr。 I/O 库永远不会关闭这些文件。
除非另有说明, I/O 函数在出错时都返回 nil (第二个返回值为错误消息,第三个返回值为系统相关的错误码)。 成功时返回与 nil 不同的值。 在非 POSIX 系统上, 根据错误码取出错误消息的过程可能并非线程安全的, 因为这使用了 C 的全局变量 errno 。
io.open (filename [, mode])
这个函数用字符串 mode 指定的模式打开一个文件。 返回新的文件句柄。 当出错时,返回 nil 加错误消息。
mode 字符串可以是下列任意值:
"r": 读模式(默认);
"w": 写模式;
"a": 追加模式;
"r+": 更新模式,所有之前的数据都保留;
"w+": 更新模式,所有之前的数据都删除;
"a+": 追加更新模式,所有之前的数据都保留,只允许在文件尾部做写入。
mode 字符串可以在最后加一个 'b' , 这会在某些系统上以二进制方式打开文件。
io.popen (prog [, mode])
这个函数和系统有关,不是所有的平台都提供。
用一个分离进程开启程序 prog, 返回的文件句柄可用于从这个程序中读取数据 (如果 mode 为 "r",这是默认值) 或是向这个程序写入输入(当 mode 为 "w" 时)
用这个可以执行些脚本命令并返回结果
io.tmpfile ()
如果成功,返回一个临时文件的句柄。 这个文件以更新模式打开,在程序结束时会自动删除。
io.type (obj)
检查 obj 是否是合法的文件句柄。 如果 obj 它是一个打开的文件句柄,返回字符串 "file"。 如果 obj 是一个关闭的文件句柄,返回字符串 "closed file"。 如果 obj 不是文件句柄,返回 nil 。
file:read (···)
读文件 file, 指定的格式决定了要读什么。 对于每种格式,函数返回读出的字符对应的字符串或数字。 若不能以该格式对应读出数据则返回 nil。 (对于最后这种情况, 函数不会读出后续的格式。) 当调用时不传格式,它会使用默认格式读下一行(见下面描述)。
提供的格式有
- "n": 读取一个数字,根据 Lua 的转换文法,可能返回浮点数或整数。 (数字可以有前置或后置的空格,以及符号。) 只要能构成合法的数字,这个格式总是去读尽量长的串; 如果读出来的前缀无法构成合法的数字 (比如空串,"0x" 或 "3.4e-"), 就中止函数运行,返回 nil。
- "a": 从当前位置开始读取整个文件。 如果已在文件末尾,返回空串。
- "l": 读取一行并忽略行结束标记。 当在文件末尾时,返回 nil 这是默认格式。
- "L": 读取一行并保留行结束标记(如果有的话), 当在文件末尾时,返回 nil。
- number: 读取一个不超过这个数量字节数的字符串。 当在文件末尾时,返回 nil。 如果 number 为零, 它什么也不读,返回一个空串。 当在文件末尾时,返回 nil。
格式 "l" 和 "L" 只能用于文本文件。
file:seek ([whence [, offset]])
设置及获取基于文件开头处计算出的位置。 设置的位置由 offset 和 whence 字符串 whence 指定的基点决定。基点可以是:
- "set": 基点为 0 (文件开头);
- "cur": 基点为当前位置;
- "end": 基点为文件尾;
当 seek 成功时,返回最终从文件开头计算起的文件的位置。 当 seek 失败时,返回 nil 加上一个错误描述字符串。
whence 的默认值是 "cur", offset 默认为 0 。 因此,调用 file:seek() 可以返回文件当前位置,并不改变它; 调用 file:seek("set") 将位置设为文件开头(并返回 0); 调用 file:seek("end") 将位置设到文件末尾,并返回文件大小。
file:setvbuf (mode [, size])
设置输出文件的缓冲模式。 有三种模式:
- "no": 不缓冲;输出操作立刻生效。
- "full": 完全缓冲;只有在缓存满或当你显式的对文件调用 flush(参见 io.flush) 时才真正做输出操作。
- "line": 行缓冲; 输出将缓冲到每次换行前, 对于某些特殊文件(例如终端设备)缓冲到任何输入前。
对于后两种情况,size 以字节数为单位 指定缓冲区大小。 默认会有一个恰当的大小。
操作系统库
os.getenv (varname)
返回进程环境变量 varname 的值, 如果该变量未定义,返回 nil 。