получить нулевое значение без видимой причины - PullRequest
0 голосов
/ 10 ноября 2019

Мне трудно понять, что не так: я должен читать строки из текстового файла, используя lua, и печатать строки, содержащие строки "login" или "logout" - и если я достигнуконец файла для печати («достигнут конец файла»). по какой-то причине первая строка (я думаю) получает нулевое значение, и поэтому я застрял .... я упомяну, что я запускаю код lua, используя cmd из той папки, в которой написан скрипт

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 ]

1 голос
/ 11 ноября 2019

Вам не нужен цикл while для чтения строк файла.

Вы можете просто использовать универсальный для цикла с 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()
1 голос
/ 10 ноября 2019

Самое простое исправление: Заменить: 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()
0 голосов
/ 10 ноября 2019

Как и @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, если хотите предположить, что тире всегда есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...