lua 多条件_【LUA】只需花费你半天时间

前言:有一段时间使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值