遇到不明原因的 nil 值
2019-11-10 11:38:42
收藏:0
阅读:90
评论:3
我正在努力找出问题所在: 我应该使用 lua 从文本文件中读取行,并打印包含字符串“login”或“logout”的行 - 如果我到达文件末尾,则打印(“到达文件末尾”)。 由于某种原因,第一行(我想是)收到了 nil 值,因此我陷入困境.... 我会提到我正在使用 cmd从脚本所在的确切文件夹运行 lua 代码
lua 代码:
file = io.open("dummy_log.txt", "r")
line = file:read()
while true do
print("第一行是:"..line)
if line == nil then
print("到达文件末尾")
break
else
if string.match(line, "login") then
print("到达登录行:" .. line)
elseif string.match(line, "logout") then
print("到达注销行:" .. line)
end
end
line = file:read()
end
file:close()
日志文件:
13:20:20 [111] 登录
13:22:00 [111] 存款
13:22:01 [111] 电话
13:50:50 [111] 注销
(写在文本文件中)。
任何帮助将不胜感激...
点赞
用户4240261
就像 @Alundaio 所说,即使是 nil,你也打印每行作为“第一行”。 while line do 将更整洁。
但更重要的是,你从未匹配过 log-in 和 log-out,因为你搜索的是没有连字号的 login 和 logout。
你可以考虑选择性匹配连字符:log%-?in,log%-?out,根据 @Alundaio 建议使用特殊字符文字语法,或使用字符类语法中的 log[-]?in,log[-]?out。
根据 @Alundaio 的答案,如果您想假设破折号始终存在,请使用 log%-in / log%-out 或 log[-]in / log[-]out。
2019-11-10 11:59:04
用户2858170
你不需要 while 循环来读取文件的每一行。
你可以简单地使用 泛型 for 循环 和 file:lines 方法。
在该循环中,line 永远不会为 nil。因此你不需要手动检查。
local file = io.open("dummy_log.txt", "r")
for line in file:lines() do
if line:find("log%-in") then
print("reached login line: " .. line)
elseif line:find("log%-out") then
print("reached logout line: " .. line)
end
end
print("end of file")
file:close()
2019-11-11 07:53:15
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

最简单的修复方法是: 将
while true do替换为while line do请记住,在检查'line'是否为空之前,您有
print("first line is: "..line)。实际上,您不希望在循环内使用
print("first line is: "..line),因为它会声称每行都是第一行。file = io.open("dummy_log.txt", "r") line = file:read() print("first line is: "..line) while line do if string.find(line, "log%-in") then print("reached login line: " .. line) elseif string.find(line, "log%-out") then print("reached logout line: " .. line) end line = file:read() end file:close()