[笔记]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月前
|
存储 Java C++
lua完整学习笔记
Lua学习笔记,涵盖了Lua的注释、数据结构、标识符、保留字、变量、运算符、函数、流程控制语句、循环语句、table的使用、迭代器以及模块化等基础知识点。
44 3
lua完整学习笔记
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
227 0
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
5月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
198 0
|
5月前
|
消息中间件 NoSQL Java
Spring Boot中使用Redis和Lua脚本实现延时队列
Spring Boot中使用Redis和Lua脚本实现延时队列
|
5月前
|
NoSQL Java Redis
redis的lua脚本
在 Lua 脚本中,可以使用redis.call()函数来执行Redis命令.
54 0
|
6月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
248 1
|
6月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
226 0