Lua 控制语句具有奇怪的行为。

我从基本的控制语句操作中得到一个非常意外的结果。我有以下内容,正在读取此类数据的文件:

1, 51, one , ab
1, 74, two , ab
0, 74, tree , ab
0, 74, for , ab
0, 74, five , ab

我使用以下 Lua 代码进行处理:

if file then
for line in file:lines() do
LineArray = line
CanClaimInfo[LineArray] = {}
lineData = utils.split(line,",")
    if lineData[1] == "0"  then
        lineData[1] = "CAN A"
    elseif lineData[1] == "1" then
        lineData[1] = "CAN B"
    else
        lineData[1] = lineData[1]
    end
CanClaimInfo[LineArray]["CANBus"] = lineData[1]
CanClaimInfo[LineArray]["Address"] = lineData[2]
CanClaimInfo[LineArray]["Name"] = lineData[3]
end

然后我得到这样的输出:

CAN A   74  for
CAN A   74  tree
CAN A   74  five
CAN B   74  two
1       51  one

我不明白它是如何逃过 elseif lineData[1] == "1" then 部分的。我检查了,没有导致前/后空格或类似的东西。有任何想法吗?

点赞
用户570336
用户570336

嗯,看起来你的utils.split函数存在一些问题。我使用了来自http://lua-users.org/wiki/SplitJoin的函数,并且它与您的代码配合得相当好:

utils = {
    split = function(str, pat)
       local t = {}  -- 注意:在Lua-5.0中使用{n = 0}
       local fpat = "(.-)" .. pat
       local last_end = 1
       local s, e, cap = str:find(fpat, 1)
       while s do
          if s ~= 1 or cap ~= "" then
         table.insert(t,cap)
          end
          last_end = e+1
          s, e, cap = str:find(fpat, last_end)
       end
       if last_end <= #str then
          cap = str:sub(last_end)
          table.insert(t, cap)
       end
       return t
    end
}

也许你的函数将1转换为一个数字(出于某种原因)。在Lua中,"1" ~= 1

2014-01-15 01:52:27
用户869951
用户869951

也许是文件开头的 utf-8 编码字节?尝试在“if”检测之前打印 lineData[1] 看看它是什么,然后使用 print(#lineData[1]) 查看它有多少个字符。很可能有多个字符,因此它会在第三个分支(else)中出现:

lineData = utils.split(line, ",")
print(#lineData[1]) -- 对于除了第一行之外的所有行,可能都打印 1
if lineData[1] == "0"  then

要找到额外的字节,请尝试 print(string.byte(lineData[1], 1, #lineData[1]))

2014-01-15 03:26:08