[笔记]Lua脚本学习笔记《一》

简介: [笔记]Lua脚本学习笔记《一》

1.基础知识

1.1. 环境搭建

vs code+code runner +lua debug

https://blog.csdn.net/yanwennian/article/details/103480938

菜鸟教程

https://www.runoob.com/lua/lua-tutorial.html

Lua Tutorial

https://www.tutorialspoint.com/lua/index.htm

2. string相关

2.1. string基本

中括号表示多行string

[[

]]

2.2. string相关函数

2.2.1. string.match函数和string.gmatch函数区别

string.match(str, pattern, init)

解释:string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。

在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil

string.gmatch (s, pattern)

解释:返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 s 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回 nil。

2.3. 匹配模式pattern

.(点): 与任何字符配对

%a: 与任何字母配对

%c: 与任何控制符配对(例如\n)

%d: 与任何数字配对

%l: 与任何小写字母配对

%p: 与任何标点(punctuation)配对

%s: 与空白字符配对

%u: 与任何大写字母配对

%w: 与任何字母/数字配对

%x: 与任何十六进制数配对

%z: 与任何代表0的字符配对

%x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*±?)的配对问题, 例如%%与%配对

[数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对

当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.例如,’%A’非字母的字符

‘%’ 用作特殊字符的转义字符,因此 ‘%.’ 匹配点;’%%’ 匹配字符 ‘%’。转义字符 ‘%’不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。

模式条目可以是:

  • 匹配前一字符1次或多次
  • 匹配前一字符0次或多次
  • 匹配前一字符0次或多次
    ? 匹配前一字符0次或1次

模式:

模式 指一个模式条目的序列。 在模式最前面加上符号 ‘^’ 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 ‘KaTeX parse error: Expected group after '^' at position 24: …锚定到字符串的结尾。 如果 '^̲' 和 '’ 出现在其它位置,它们均没有特殊含义,只表示自身。

捕获:

模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 “(a*(.)%w(%s*))” , 字符串中匹配到 “a*(.)%w(%s*)” 的部分保存在第一个捕获物中 (因此是编号 1 ); 由 “.” 匹配到的字符是 2 号捕获物, 匹配到 “%s*” 的那部分是 3 号。

作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 “()aa()” 作用到字符串 “flaaap” 上,将产生两个捕获物: 3 和 5 。

3. io相关

3.1. IO 常见问题

3.1.1. open 函数 使用相对路径时 要注意起点为当前项目根目录

比如

当前在shaowei.zhao项目

io_test.lua在shaowei.zhao/src目录

io_conf.txt在shaowei.zhao/src目录

则open的文件路径用相对路径 要注意是在shaowei.zhao为起点。

打开io_conf 需要用 ./src/io_conf.txt 或者src/io_conf.txt为文件路径

4. table

table可以是数组array,字典map

4.1 插入

table.insert (table, [pos,] value):

4.2 删除

table.remove (table [, pos])

4.3 排序

按字母a-z,数字0-9排序

table.sort (table [, comp])

4.4 map的初始化

local map = { id = 1,name = 2}

print(map[“id”])

for k, v in pairs(map) do

print(k…"="…v)

end

5. 迭代器

6. Metatable

7. json

使用CJson参考:https://www.jianshu.com/p/c5f3d4ec1497

基本就是找个动态库 cjson.dll 放到lua/clibs下面即可 使用cjson

local jsonData = [[ 
            { 
              "test": 1,
            "data": false,
            "sample": "sample"
           }
]] --这个是string类型 可以使用type(jsonData)判断

8. sqlite

luasql.sqlite3教程:https://www.tutorialspoint.com/lua/lua_database_access.htm

菜鸟教程 sql教程:https://www.runoob.com/sql/sql-delete.html

9. pcre正则

pcre 正则表达式 不是lua的string模式匹配表达式

正则表达式教程:http://mushclient.com/pcre/pcrepattern.html

10. 常见问题

10.1. #号

10.1.1. 一元运算符 返回一个字符串或者一个表的长度

print(“len:”,#fruits)

print(“strlen”,#“helloworld”)

10.1.2. 判断不定参数数量:select("#",…)

10.2. …和,区别

… :连接两个字符串。

例如:print(“Hello”…“World”)==>HelloWorld

, :

10.3. 模块与C包 引入问题

10.3.1. require函数 载入模块

在加载一个.lua文件时,require会先在package.loaded中查找此模块是否存在,如果存在,直接返回模块。

如果不存在,则加载模块文件。

注意:

模块库需要单独放在其他目录中,跟源码src中 require载入时 会提示报错 找不到

如果非要和源码放在一起,另一种解决办法是相对路径先出这个文件夹再进入文件夹

例如:

lua_lib 在 src目录下

require("…/src/lua_lib")

10.3.2. loadfile函数

dofile:读入代码文件并编译执行。每调用dofile一次,都会重新编译执行一次。

loadfile:编译代码,将整个模块文件当成一个函数返回,但是不执行代码。

10.3.3. loadlib函数 载入C包

loadlib 函数加载指定的动态链接库并且连接到 Lua,然而它并不打开库(也就是说没有调用初始化函数),反之他返回初始化函数作为 Lua 的一个函数

10.3.4. load函数

https://www.junmajinlong.com/lua/dofile_loadfile_load/

load()从给定字符串中读取代码或从一个函数中读取代码,然后以函数的方式返回。如果chunk是一个函数,load()将不断调用该函数来获取代码片段,直到该函数遇到nil。


相关文章
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
63 0
|
2月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
76 0
|
2天前
|
存储 NoSQL 调度
Redis Lua脚本:原子性的真相揭秘
【4月更文挑战第20天】
9 0
Redis Lua脚本:原子性的真相揭秘
|
21天前
|
NoSQL Java Redis
lua脚本做redis的锁
这段内容是关于使用Redis实现分布式锁的Java代码示例。`RedisLock`类包含`lock`和`unlock`方法,使用`StringRedisTemplate`和Lua脚本进行操作。代码展示了两种加锁方式:一种带有过期时间,另一种不带。还提到了在加锁和解锁过程中的异常处理,并提供了相关参考资料链接。
18 3
|
24天前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
|
1月前
|
监控
通过Lua脚本实现禁止员工上班玩游戏的软件的自动化任务管理
使用Lua脚本,企业可以自动化管理员工行为,防止上班时间玩游戏。Lua是一种轻量级脚本语言,适合编写监控任务。示例脚本展示了如何检测工作时间内员工是否玩游戏,并在发现时执行相应操作,如关闭游戏或发送警告。此外,另一脚本演示了如何将监控数据通过HTTP POST自动提交到网站,以实现有效的行为管理。这种解决方案灵活且可定制,有助于提升工作效率。
123 1
|
1月前
|
NoSQL Java 数据库
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
|
1月前
|
Java API Maven
|
2月前
|
NoSQL Java 数据处理
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
57 0
|
3月前
|
存储 NoSQL 关系型数据库
Redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
Redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
73 0

相关实验场景

更多