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也可以实现...
lua 多条件_【LUA】只需花费你半天时间相关推荐
- excel其中一个页签慢_技巧 | 只需10秒,便可对Excel多页签进行快速有效汇总
在Excel中,多页签的数据汇总,是一个出镜频率极高的问题,有人用VBA,有人用函数,有人用最传统的方式--总之,就是八仙过海,各显神通-- 然而,模式虽多,但当Excel小白实操起来,大脑又是一片空 ...
- python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...
针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...
- python入门只需20分钟-史上最详细python学习路线-从入门到精通,只需5个月时间...
针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...
- python 需要多久能够学精通_python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...
针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...
- 史上最详细python学习路线-从入门到精通,只需5个月时间
针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...
- 安卓软件如何迁移鸿蒙,华为余承东:安卓系统迁移到鸿蒙OS 只需1-2天时间
原标题:华为余承东:安卓系统迁移到鸿蒙OS 只需1-2天时间 华为消费者业务首届开发者大会今日举行.在大会上,华为消费者CEO余承东公布了一个振奋人心的好消息:国产自由操作系统鸿蒙OS发布,率先用于智 ...
- c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!
★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...
- latex 插图解释_大O符号-只需插图和视频即可解释
latex 插图解释 Big O notation is used to communicate how fast an algorithm is. This can be important whe ...
- excel筛选排序从小到大_数据横向排序和筛选,Ctrl+F搭配通配符quot;*quot;,只需简单四步完成...
数据的排序和筛选,相信大家都有操作过.但我们在利用Excel表格进行数据排序筛选的时候,基本都是数据的纵向操作,也就是按列的方式进行数据操作.今天我们就来学习一下,如何对数据进行横向的排序和筛选. 如 ...
最新文章
- 非抢占式优先算法例题_非抢占式高优先级调度算法
- 2020-10-26(对Dex文件的理解)
- fzu 1894 单调队列
- Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
- java面试题4 牛客:运行下列代码,运行结果为
- c语言上机指导答案清华,第一章自测练习答案清华大学c语言习题实验指导及课程设计...
- (三)Clang/ LLVM编译流程简述
- ubuntu12.04 + virtualbox
- python学习手册-Python学习手册
- 20180925-1 每周例行报告
- android上传到svn服务器端,上传Android项目到SVN
- Linux系列之Linux安装及源配置(软件源)的介绍
- gsyVideoPlayer直播短视频回放,集成腾讯播放器
- 关于数学建模的个人见解(实验室专用)
- TLV自定义通信协议的编码和解析
- 一个葫芦娃的小程序,爷青回!
- 十分钟看懂图像语义分割技术
- 扫地机器人的轮子困住_扫地机器人防困住卡死的解决方案
- multisg P2SH
- Linux应用层与内核驱动层3种交互方式