硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2027|回复: 5
收起左侧

[LUA教程] H7-TOOL的LUA小程序教程第2期:变量,循环,函数,条件语句和字符串相关API

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2021-12-4 00:07:04 | 显示全部楼层 |阅读模式
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。

TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


掌握这些基础就够用了。

一、注释

注释、多行注释、取消多行注释:

注释单行
  1. --local a = 1
复制代码

注释多行
  1. --[[
  2. local a = 1
  3. --]]
复制代码

取消注释多行
  1. ---[[
  2. local a = 1
  3. --]]
复制代码

二、变量:

变量
1.变量无需声明
2.变量没声明为nil,赋值为nil等同于删除
3.lua把nil,false视为假,其他都为true
4.Lua中的变量全是全局变量,除非用 local 显式声明为局部变量
5.#ta字符串的长度,也可以获取表格数字索引对应的个数

例子
  1. --全局赋值
  2. x = 1

  3. --局部多个赋值
  4. local x,y = 1,2

  5. local ta = {1,2,3,name='安富莱'}
  6. --3
  7. print(#ta)
复制代码



三、条件:

条件
if
and or not
>= <= == > < ~=

例子
  1. if (a >= 0) then   --大于等于
  2.   b = b + 1
  3. else
  4.   b = b - 1
  5. end

  6. if (a ~= 0) then   --不等于
  7. end

  8. if (a==b and c == 0) then --逻辑与

  9. elseif (a~=b) then  --不等于

  10. elseif (not a) then  --逻辑非

  11. else

  12. end
复制代码

四、循环

例子
  1. local a=10
  2. while (a < 20)
  3. do
  4.    a = a + 1
  5.    print(a)
  6. end

  7. local t = {1,2,3}
  8. for i,v in pairs(t) do
  9.     print(v)
  10. end
复制代码

--每次加1
  1. for i=0,5,1 do
  2.     print(i)
  3. end

复制代码

--每次减1
  1. --5,4,3,2,1
  2. for i=5,1,-1 do
  3.     print(i)
  4. end
复制代码



五、函数

例子:
  1. --声明函数,传递2个参数,返回2个值得和
  2. function add(num1, num2)
  3.    return num1 + num2
  4. end
复制代码


--把函数赋值给一个变量,然后可以当参数传递
  1. local myprint = function(str)
  2.    print(str)
  3. end

  4. function say(arg1,func)
  5.     func(arg1)
  6. end

  7. --www.freecls.com
  8. say('www.freecls.com',myprint)
复制代码


--可变参数
  1. function average(...)
  2.    result = 0
  3.    local arg={...}
  4.    for i,v in ipairs(arg) do
  5.       result = result + v
  6.    end
  7.    print("总共传入 " .. #arg .. " 个数")
  8.    return result/#arg
  9. end
复制代码
  1. function what()
  2.     return '安富莱','www.armlfy.com'
  3. end

  4. --返回多个参数
  5. local name,url = what()
  6. print(name,url)
复制代码




五、常用字符串函数:

string.byte(s [, i [, j]])

string.byte是用来把字符转换成ascii数字,
s为目标字符串,i为索引开始位置(从1开始),j为索引结束位置

例子
  1. --默认为第1个返回a的ascii值
  2. local r = string.byte('abcdefg') --97
  3. --从索引2(b)到索引4(d)也就是分别返回bcd的ascii值
  4. local r1,r2,r3 = string.byte('abcdefg',2,4) --98,99,100
复制代码

string.char(...)

string.char是把ascii数值转换成字符
例子
  1. --返回98所对应的字符
  2. local r = string.char(98) --a
  3. --返回98,,99,100对应的字符并连在一起返回
  4. local r = string.char(98,99,100) --abc
复制代码


string.sub (s, i [, j])

截取字符串(字符串分割,字符串截取),i为起始索引,可选参数j为结束索引(包含),都可以为负数,第一个字符索引为1,最后一个字符为-1
例子
  1. local res,s
  2. s = 'www.armfly.com'
  3. res = string.sub(s,5)     --armfly.com
  4. res = string.sub(s,5,-1)  --armfly.com

  5. --截取后3位
  6. res = string.sub(s,-3)    --com

  7. --截取前3位
  8. res = string.sub(s,1,3)   --www
复制代码


string.find (s, pattern [, init [, plain]])

字符串查找函数找不到返回nil,找到了返回开始位置和结束位置,
init为从哪里开始默认为1,plain默认为false表示利用模式匹配,
如果设为true则表示纯文本匹配(也就是关闭正则匹配)
例子
  1. local str = 'i love programming,11,22,%d+aa'
  2. local s = string.find(str,'222')    --nil
  3. s = string.find(str,'pro')  --8
  4. s = string.find(str,",%d+")    --19(匹配到了,11)
  5. s = string.find(str,",%d+",1,true) --25(由于关闭了模式匹配,所以匹配到了,%d+)
复制代码

string.match (s, pattern [, init])

它跟string.find差不多,只不过能把捕获匹配到的结果并返回
例子
  1. local s,res,res1,res2
  2. s = 'http://www.armfly.com'

  3. --由于没有捕获,返回全部匹配
  4. --结果:http://www.armfly.com
  5. res = string.match(s,'http://%a+.%a+.com')

  6. --如果有捕获,则分别返回捕获结果
  7. --结果:www    armfly
  8. res1,res2 = string.match(s,'http://(%a+).(%a+).com')
复制代码

string.gsub (s, pattern, repl [, n])

用来做字符串替换,可选参数n代表替换多少次默认全部替换,
返回替换后的字符串,也可以指定第二个返回值为替换的次数。
例子
  1. local s,res,res1,res2
  2. s = 'http://www.armfly.com'

  3. --结果:http://test.armfly.com,1
  4. res,count = string.gsub(s,'www','test')

  5. --捕获替换
  6. --结果:test.freecls.abc
  7. res = string.gsub(s,'^http://%w+.(%w+).com$','test.%1.abc')

  8. --w替换成t,但是只替换2次
  9. --结果:http://ttw.armfly.com
  10. res = string.gsub(s,'w','t',2)
复制代码

string.format (formatstring, ···)

字符串格式化类型c语言的sprintf不说废话以例子来讲解

  1. local s = string.format('%d%s',123,'armfly')   --123armlfy

  2. s = string.format('%0.2f',1.234343)     --1.23(保留2位)

  3. --转成16进制,%X为大写的16进制
  4. local s = string.format('%X',140)       --8C
  5. local s = string.format('%x',140)       --8c
  6. local s = string.format('%04x',140)     --008c
复制代码

string.len(s)

返回字符串长度=#s

string.rep(s,n)

字符串重复n次并拼接返回

string.lower(s)

转小写

string.upper(s)

转大写

string.reverse(s)

反转字符串

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-12-4 00:37:58 | 显示全部楼层
更新完毕
回复

使用道具 举报

1

主题

132

回帖

135

积分

初级会员

积分
135
发表于 2021-12-6 11:15:52 | 显示全部楼层
系统学习下 Lua
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-12-6 15:02:20 | 显示全部楼层

本周继续更新一个章节。
回复

使用道具 举报

1

主题

132

回帖

135

积分

初级会员

积分
135
发表于 2021-12-6 15:40:08 | 显示全部楼层
eric2013 发表于 2021-12-6 15:02
本周继续更新一个章节。

这篇教程很详尽了,  今天从头到尾我都实操了一遍,   从 1 点到现在才结束。

string.char 函数这边注释有点问题,  应是 b, 教程中是 a  :  
string.char(98)    --  b
string,char(98,  99,  100)  -- bcd
20211206.png
回复

使用道具 举报

1

主题

132

回帖

135

积分

初级会员

积分
135
发表于 2021-12-6 15:44:44 | 显示全部楼层
eric2013 发表于 2021-12-6 15:02
本周继续更新一个章节。

期待

这个函数,  没正则基础的,  看得可能有点迷糊




20211206_2.png
正则.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 05:05 , Processed in 0.522425 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表