前言:有一段时间使用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也可以实现...

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

  1. excel其中一个页签慢_技巧 | 只需10秒,便可对Excel多页签进行快速有效汇总

    在Excel中,多页签的数据汇总,是一个出镜频率极高的问题,有人用VBA,有人用函数,有人用最传统的方式--总之,就是八仙过海,各显神通-- 然而,模式虽多,但当Excel小白实操起来,大脑又是一片空 ...

  2. python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  3. python入门只需20分钟-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  4. python 需要多久能够学精通_python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  5. 史上最详细python学习路线-从入门到精通,只需5个月时间

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  6. 安卓软件如何迁移鸿蒙,华为余承东:安卓系统迁移到鸿蒙OS 只需1-2天时间

    原标题:华为余承东:安卓系统迁移到鸿蒙OS 只需1-2天时间 华为消费者业务首届开发者大会今日举行.在大会上,华为消费者CEO余承东公布了一个振奋人心的好消息:国产自由操作系统鸿蒙OS发布,率先用于智 ...

  7. c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!

    ★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...

  8. latex 插图解释_大O符号-只需插图和视频即可解释

    latex 插图解释 Big O notation is used to communicate how fast an algorithm is. This can be important whe ...

  9. excel筛选排序从小到大_数据横向排序和筛选,Ctrl+F搭配通配符quot;*quot;,只需简单四步完成...

    数据的排序和筛选,相信大家都有操作过.但我们在利用Excel表格进行数据排序筛选的时候,基本都是数据的纵向操作,也就是按列的方式进行数据操作.今天我们就来学习一下,如何对数据进行横向的排序和筛选. 如 ...

最新文章

  1. 非抢占式优先算法例题_非抢占式高优先级调度算法
  2. 2020-10-26(对Dex文件的理解)
  3. fzu 1894 单调队列
  4. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
  5. java面试题4 牛客:运行下列代码,运行结果为
  6. c语言上机指导答案清华,第一章自测练习答案清华大学c语言习题实验指导及课程设计...
  7. (三)Clang/ LLVM编译流程简述
  8. ubuntu12.04 + virtualbox
  9. python学习手册-Python学习手册
  10. 20180925-1 每周例行报告
  11. android上传到svn服务器端,上传Android项目到SVN
  12. Linux系列之Linux安装及源配置(软件源)的介绍
  13. gsyVideoPlayer直播短视频回放,集成腾讯播放器
  14. 关于数学建模的个人见解(实验室专用)
  15. TLV自定义通信协议的编码和解析
  16. 一个葫芦娃的小程序,爷青回!
  17. 十分钟看懂图像语义分割技术
  18. 扫地机器人的轮子困住_扫地机器人防困住卡死的解决方案
  19. multisg P2SH
  20. Linux应用层与内核驱动层3种交互方式

热门文章

  1. iOS网络开发(8)文件下载的实现
  2. 第五十一条:当心字符串的连接性能
  3. 谁说女生不能搞IT?一名女程序员的奋斗史
  4. java 和 flash socket通信封装
  5. SQLServer2000同步复制技术实现步骤
  6. BCH(比特币现金)的货币流通速度是BTC的6倍
  7. 理解haslayout
  8. xmake新增对WDK驱动编译环境支持
  9. 《深入浅出MFC》系列之动态创建
  10. python数据分析(九)-点积与线性代数