前言:有一段时间使用OpenResty写Waf防护模块的时候使用到了Lua。Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
学习Lua代码,从变量到跑路
x=1 --全局变量 local x=1 --局部变量function a() b=2 --全局变量 local c=2 --局部变量 endprint(b,c) -- 2,nillocal _M = {} --空tabel 也叫空数组 _M["key"] = "value" --填充值 --给tabel增加方法_M.Find = function() print("local") endd,d2 = 2,3 -- 定义值,多个 d,d2 = d2,d --swap交换值 print(d,d2) --3,2--条件语句if true then print(xxx) endif true then print(xx) else if false then print(x) end end--遍历tabelfor k,v in ipairs(_M) do print(k,v) end --ipairs和pairs都是的迭代器,区别,--ipairs遇到tabel内容为nil的时候,终止循环--注意:lua迭代器下标是从1开始for k,v in pairs(_M) do print(k,v) end--循环--x=初始值,最大值,步长值 步长值代表每次递增多少数for x=1,10,3 do print(x) end --while循环local a = 10 while(a<100) do a = a+10 print(a) end--repeat-until循环,先执行,后判断,类似语言do---whilelocal b = 10 repeat print(b) b = b+1 until(b>15) --当b大于15的时候结束循环--函数定义,系统默认是全局function a() do print("all in") end --局部函数使用local,也支持向tabel添加方法local func = function() print("local") end --可变参数,接受未知个参数funciton args(...) local result = 0 ---将参数写入tabellocal arg = {...} for k,v = ipairs(arg) do print(k,v) end --#arg代表统计有多少个参数print("参数总数:",#arg) end --Demo(当传入为nil参数的时候,是不算个数):function fun(...) local x={...} print(#x)end fun(1,2,3,4,5,nil) --5 fun(1,2,3,4,5,0) --6---#xx 统计坑,取决于最大的索引值,如果有越标行为,则按越标前一位计算总数local xx = {} xx[1] = 2 xx[2] = 3 print(#xx) local xx = {} xx[1] = 2 xx[8] = 3 print(#xx)--字符串local x = "aaaaa" local x = ’aaaaa‘ local x = [[ 一组模板数据]]--字符串连接 ..local c = x..b--模块与包--定义a.lua文件a = {} a.constant = "常量" a.func1 = function() print("a模块 1方法") end a.func2 = function() print("a模块 2方法") end return a --定义b.lua文件--require("a")require("a") a.func1() --local m = require("a")m.func1()--lua加载c库local path = "/usr/local/lua/lib/libluasocket.so" -- 或者 path = "C:windowsluasocket.dll",这是 Window 平台下local f = assert(loadlib(path, "luaopen_socket")) f() -- 真正打开库--协同程序function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入end) print("main", coroutine.resume(co, 1, 10)) -- true, 4 print("--分割线----") print("main", coroutine.resume(co, "r")) -- true 11 -9 print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- true 10 end print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine print("---分割线---") --[[第一次运行之后,挂起yield第二运行,先执行上次的yield输出,再执行本次调用第三次运行,执行上一次yield输出,再执行本次结束协同程序第四次就提示dead了]]--文件操作,基于io类--打开file = io.open("文件名","打开方式") --r w a r+ w+ a+ b --读取io.input(file) io.read() --写入io.output(file) io.write("hhhhh") --关闭io.close(file)--面向对象A = {t=0} A.func1 = function() print(A.t) end--继承B = {area=0} --基础类B:new =function(o,p2) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基础类方法 printAreafunction B:printArea() print("面积为 ",self.area)end-- 创建对象myshape = Shape:new(nil,10) myshape:printArea()Square = Shape:new() -- 派生类方法 newfunction Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return oend-- 派生类方法 printAreafunction Square:printArea () print("正方形面积为 ",self.area)end-- 创建对象mysquare = Square:new(nil,10) mysquare:printArea()Rectangle = Shape:new() -- 派生类方法 newfunction Rectangle:new (o,length,breadth) o = o or Shape:new(o) setmetatable(o, self) self.__index = self self.area = length * breadth return oend-- 派生类方法 printAreafunction Rectangle:printArea () print("矩形面积为 ",self.area)end-- 创建对象myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
总结
如果你有用到openresty作一个补丁包开发,建议使用lua脚本方式,随然c也可以实现...
前言:有一段时间使用OpenResty写Waf防护模块的时候使用到了Lua。Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
学习Lua代码,从变量到跑路
x=1 --全局变量 local x=1 --局部变量function a() b=2 --全局变量 local c=2 --局部变量 endprint(b,c) -- 2,nillocal _M = {} --空tabel 也叫空数组 _M["key"] = "value" --填充值 --给tabel增加方法_M.Find = function() print("local") endd,d2 = 2,3 -- 定义值,多个 d,d2 = d2,d --swap交换值 print(d,d2) --3,2--条件语句if true then print(xxx) endif true then print(xx) else if false then print(x) end end--遍历tabelfor k,v in ipairs(_M) do print(k,v) end --ipairs和pairs都是的迭代器,区别,--ipairs遇到tabel内容为nil的时候,终止循环--注意:lua迭代器下标是从1开始for k,v in pairs(_M) do print(k,v) end--循环--x=初始值,最大值,步长值 步长值代表每次递增多少数for x=1,10,3 do print(x) end --while循环local a = 10 while(a<100) do a = a+10 print(a) end--repeat-until循环,先执行,后判断,类似语言do---whilelocal b = 10 repeat print(b) b = b+1 until(b>15) --当b大于15的时候结束循环--函数定义,系统默认是全局function a() do print("all in") end --局部函数使用local,也支持向tabel添加方法local func = function() print("local") end --可变参数,接受未知个参数funciton args(...) local result = 0 ---将参数写入tabellocal arg = {...} for k,v = ipairs(arg) do print(k,v) end --#arg代表统计有多少个参数print("参数总数:",#arg) end --Demo(当传入为nil参数的时候,是不算个数):function fun(...) local x={...} print(#x)end fun(1,2,3,4,5,nil) --5 fun(1,2,3,4,5,0) --6---#xx 统计坑,取决于最大的索引值,如果有越标行为,则按越标前一位计算总数local xx = {} xx[1] = 2 xx[2] = 3 print(#xx) local xx = {} xx[1] = 2 xx[8] = 3 print(#xx)--字符串local x = "aaaaa" local x = ’aaaaa‘ local x = [[ 一组模板数据]]--字符串连接 ..local c = x..b--模块与包--定义a.lua文件a = {} a.constant = "常量" a.func1 = function() print("a模块 1方法") end a.func2 = function() print("a模块 2方法") end return a --定义b.lua文件--require("a")require("a") a.func1() --local m = require("a")m.func1()--lua加载c库local path = "/usr/local/lua/lib/libluasocket.so" -- 或者 path = "C:windowsluasocket.dll",这是 Window 平台下local f = assert(loadlib(path, "luaopen_socket")) f() -- 真正打开库--协同程序function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入end) print("main", coroutine.resume(co, 1, 10)) -- true, 4 print("--分割线----") print("main", coroutine.resume(co, "r")) -- true 11 -9 print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- true 10 end print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine print("---分割线---") --[[第一次运行之后,挂起yield第二运行,先执行上次的yield输出,再执行本次调用第三次运行,执行上一次yield输出,再执行本次结束协同程序第四次就提示dead了]]--文件操作,基于io类--打开file = io.open("文件名","打开方式") --r w a r+ w+ a+ b --读取io.input(file) io.read() --写入io.output(file) io.write("hhhhh") --关闭io.close(file)--面向对象A = {t=0} A.func1 = function() print(A.t) end--继承B = {area=0} --基础类B:new =function(o,p2) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基础类方法 printAreafunction B:printArea() print("面积为 ",self.area)end-- 创建对象myshape = Shape:new(nil,10) myshape:printArea()Square = Shape:new() -- 派生类方法 newfunction Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return oend-- 派生类方法 printAreafunction Square:printArea () print("正方形面积为 ",self.area)end-- 创建对象mysquare = Square:new(nil,10) mysquare:printArea()Rectangle = Shape:new() -- 派生类方法 newfunction Rectangle:new (o,length,breadth) o = o or Shape:new(o) setmetatable(o, self) self.__index = self self.area = length * breadth return oend-- 派生类方法 printAreafunction Rectangle:printArea () print("矩形面积为 ",self.area)end-- 创建对象myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
总结
如果你有用到openresty作一个补丁包开发,建议使用lua脚本方式,随然c也可以实现...
![58274e5f5f44306d44e63bb7a7fded0d.png](https://i-blog.csdnimg.cn/blog_migrate/1f938b8593a891aaf92c41686774d6b2.jpeg)