Lua5.1编程3:Lua标准库介绍

来源:互联网 发布:淘宝买家秀合集 编辑:程序博客网 时间:2024/06/05 06:02

Lua核心提供的功能很有限,大部分功能均为通过标准库来实现。

1 数学库

三角函数
sin/cos/tan/asin/scos ...

指对数函数
exp/log/log10

取整函数
floor/ceil
max/min

随机数函数
random()           不带参数时返回0-1的随机小数,带整数参数则返回0-N的一个随机数
randomseed()  设置随机数种子

2 table库
table.insert(tbl,idx,value)     将tbl的idx位置插入value。若未指定idx参数,则在末尾插入。
table.remove(tbl,idx,value)  删除tbl的idx位置的value。默认删除最后一个元素。
table.concat(tbl,sep)            将tbl的元素拼接在一起,中间以seq分隔
table.sort(t,compf)                根据compf对t的值进行排序,默认为<函数。
下面的代码实现了一个按key的顺序迭代一个表
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. function keyOrderValues(t,comp)  
  2.     local a = {};  
  3.     for k,v in pairs(t) do  
  4.         a[#a+1] = k;  
  5.     end  
  6.   
  7.     table.sort(a,comp);  
  8.   
  9.     local i = 0;  
  10.     return  function(a,i)  
  11.                 i = i + 1;  
  12.                 return a[i],t[a[i]]  
  13.             end  
  14. end  

3 string库
3.1 基本函数

string.len(s)         返回字符串的长度
string.rep(s,n)     返回s重复n次的结果
string.lower(s)     转为小写,按当前的locale设置进行
string.upper(s)    转为大写
string.sub(s,start,end)           取子串
string.char(s[,start[,end]])     返回整数n代表的字符
string.byte(b,...)                       返回字符c底层的字节整数
string.byte(s,start,end)          同上
string.format("fmt",...)            按照fmt的格式来格式化字符串,格式同printf

3.2 模式匹配
string.find(s,pattern)            返回子串在父串中的开始和结尾位置,若无则返回nil
string.match(s,pattern)       返回模式在s中的匹配串,无则返回nil
string.gsub(s,patt,rep,cnt) 将匹配的串替换为rep,cnt指定替换的次数,默认为1
string.gmatch(s,pattern)    返回遍历所有指定模式的迭代器
示例:从url中获取host名分
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. string.match(url,"http://(.-)/")  

Lua的模式介绍
字符分类
%a       字母  [a-zA-Z] 
%b<x><y> 匹配在<x> <y>之间的字符
%c       控制字符
%d       数字
$l       小字母 [a-z]
%u       大写字母 [A-Z]
%p       标点
%s       空白字符 
%w       字母与数字 [a-zA-z0-9]
%x       十六进制数字 [0-9a-fA-F]
%z       内容表示为0的字符
所有这些分类的大写形式表示补集的概念。
() . % + - * ? [] ^ $ 具有特殊含义。如果要匹配这些字符需要进行转义。
. 代表所有字符
[]  在集合中
[^] 不在集合中
()  用于进行分组捕获,按从外向内,由左向右进行编号。
%   转义
+   出现1次或多次
-   出现0或多次,但只做最小匹配
?   出现0或1次
*   模式出现0或多次,做最大匹配子串
^   模式出现在头
$   模式出现在结尾


4 IO库
4.1 简单IO操作

简单操作所有操作都作用于标准输入和输出。
io.input(file)      设置输入文件
io.output(file)    设置输出文件
io.read(type,...) 从设置的输入中获取数据,默认为标准输入。参数决定如何读取数据
   "*all"  读取整个文件
   "*line" 读取下一行
   "*number"读取一数字
   <num>   读取不超过<num>个字符,用于进行块读取
io.write(str,...)   向设置的输出中写入数据,默认为标准输出
print(str,...)        向标准输出写入数据
io.lines()           返回输入的所有行


4.2 完整IO模型
io.open(file,mode)     打开文件,返回一个句柄,如果出错,则返回nil及出错的消息。mode有r/wb。有了文件句柄,就可以在句柄上进行操作
io.tmpfile()                   返回一个临时文件句柄,以读写方式打开,程序结束后自动删除。
io.flush()                      刷新缓冲中的数据

性能优化
lines,rest = io.read(BUFSIZE,"*line") 可以实现缓冲设计,另外rest部分保存被bufsize截断的行的后一段

file.seek(whence,offset)  返回设置后的文件指针偏移量
定位文件指针,whence取值有set,cur,end分别指示文件头、当前位置、文件尾,而offset指示相对于whence的偏移量。如果希望获得文件大小,则调用seek('end',0)
file.read()
file.write()
file.lines()
file.setvbuf()
file.close()

5 OS库
os.time()              返回当前时间戳,时间起点可以用table{y,m,d,h,m,s}来指定,默认格式为%c(以特定格式进行格式化)
os.date("fmt",ts)  对ts表示的时间以fmt进行格式化,如date("%Y-%m-%d %H:%M:%S",time())
os.exit()
os.getenv(key)     获取系统变量
os.execute(str)    执行系统命令,返回值为命令的输出流及返回代码
os.setlocale(value,type) 设置指定的类型的值,type默认为all,有time,numberic,monetary,collate,ctype

6 debug库

调度库中包含两类机制,一类是自省,另一类是钩子函数。
6.1 自省机制
debug.getinfo(func,t)         获取指定函数的执行信息,返回一个table,可以以数字指定调用层级。通过t可以指定获取哪些信息。
debug.traceback(func)     获得栈的回溯
debug.getlocal(func,var)  检查函数调用func中的指定局部变量的值
debug.setlocal(func,var,val)
debug.getupvalue(func,idx)  获取非局部变量的值
debug.setupvalue()

6.2 钩子

Lua支持为执行中的事件注册钩子函数。

有以下4类事件。

调用函数的call事件 c
函数执行完return事件 r
执行一行首先line事件 l
执行指令数count事件 count
debug.sethook(func,event) 可以为事件设置相应的处理函数

通过以上这些机制,可以对程序进行运行时性能统计、调试等。例如统计各函数的执行时间,函数的执行次数。函数执行的上下文信息。

0 0
原创粉丝点击