无明显理由获得零价值

时间:2019-11-10 11:38:42

标签: lua

我很难找出问题所在: 我应该使用lua从文本文件中读取行,并打印包含字符串“ login”或“ logout”的所述行-如果到达文件末尾,则进行打印(“到达文件末尾”)。 由于某种原因,第一行(我认为)正在接收nil值,因此我被卡住了... 我会提到我正在使用从脚本编写的确切文件夹中的cmd运行lua代码

lua code:
file = io.open("dummy_log.txt", "r")
line = file:read() 

while true do 
    print("first line is: "..line)
    if line == nil then
        print("reached end of file")
        break
    else 
        if string.match(line, "login") then
            print("reached login line: " .. line)
        elseif string.match(line, "logout")  then
            print("reached logout line: " .. line)
        end
    end
    line = file:read()
end
file:close()

log file:
13:20:20 [111] log-in
13:22:00 [111] deposit
13:22:01 [111] phone-call
13:50:50 [111] log-out
(is written in a text file).

我们将不胜感激...

3 个答案:

答案 0 :(得分:1)

最简单的解决方法是: 替换:while true do 使用:while line do

在检查“行”是否为零之前,请记住您有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()

答案 1 :(得分:1)

您不需要while循环即可读取文件行。

您可以将generic for loopfile: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()

答案 2 :(得分:0)

就像@Alundaio said一样,即使每行都是nil,您也将其打印为“第一行”。 while line do会更整洁。

但是最重要的是,您永远不会匹配log-inlog-out,因为您正在搜索loginlogout(不带破折号)。

您可能要考虑可选的短划线:log%-?inlog%-?out,按照@Alundaio的建议使用特殊字符文字语法,或者使用log[-]?inlog[-]?out在破折号上使用字符类语法。

根据@Alundaio的回答,如果您想假设破折号始终存在,请使用log%-in / log%-outlog[-]in / log[-]out