Lua- 迭代嵌套表

我已经学习 Lua 几个星期了,但是每次都遇到一个难点。 我尝试阅读这个主题的帖子和书籍。

我使用 Lua 查询软件监控系统(Nimsoft),我的数据以表格形式返回给我。

我不会发布整个输出,但是这里是一个我认为可以描述结构的片段:

表引用为 "h_resp"

`` ` root: domain:nevil-nmsdom robotlist: 1: ssl_mode:0 os_user2: origin:nevil-nmshub os_major:UNIX ip:192.168.1.58 os_minor:Linux addr:/nevil-nmsdom/nevil-nmshub/nevil-multibot_03 status:0 license:1 last_inst_change:1340754931 created:1341306789 offline:0 last_change:1341306869 lastupdate:1344522976 autoremove:0 os_user1: flags:1 os_description:Linux 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64 name:nevil-multibot_03 metric_id:M64FB142FE77606C2E924DD91FFCC3BB4 device_id:DDFF83AB8CD8BC99B88221524F9320D22 heartbeat:900 port:48100 version:5.52 Dec 29 2011 2:等等...

`` `

我使用在此论坛上找到的 tdump 函数来实现此目的。

`` ` for k,v in pairs(h_resp)do print(k ..“ ”v) end

`` `

给我顶部,我明白这一点。

`` ` domain nevil-nmsdom robotlist table:0x22136a0

`` `

然后我尝试获取“ robotlist”

`` ` for k,v in pairs(h_resp.robotlist)do print(k ..“ ”v) end

`` `

如下所示,索引是整数,值是另一个表。

`` ` 1 表:0x237e530 0 表:0x22112a0 3 表:0x2211460 2 表:0x2392ee0 5 表:0x2213e80 4 表:0x22130e0 7 表:0x2283b80 6 表:0x2283ff0 8 表:0x22a71e0

`` `

我还明白我可以使用以下内容之一来解决其中一个“嵌套”表格的问题:

`` ` for k,v in pairs(h_resp.robotlist [“0”])do print(k ..“ ”v) end

ssl_mode 0 os_user2 origin network os_major UNIX ip 192.168.1.31 os_minor Linux addr /nevil-nmsdom/nevil-nmshub/nevil-mysql status 0 ...等待等待...

`` `

至于我的观点,我无法弄清楚如何要求 Lua 迭代存储在 robotlist 中的所有表。

其次,我为冗长的电子邮件道歉,但我仍在努力学习/理解这一点……我没有先前的编程/脚本编写经验。

谢谢

点赞
用户752976
用户752976

如果你想要打印表格列表,然后是每个表格的内部,然后再次(就像在inception中一样),最简单的方法就是使用递归

您需要检查您正在查看的表的当前元素的类型:

function DeepPrint (e)
    -- 如果e是一个表格,我们应该遍历它的元素
    if type(e) == "table" then
        for k,v in pairs(e) do -- 遍历表中的每个元素
            print(k)
            DeepPrint(v)       -- 递归重复相同的过程
        end
    else -- 如果不是,我们就可以直接打印它
        print(e)
    end
end

您应该查看Lua手册,一切都在那里解释。//编辑:我应该更清楚一点;手册中有一个与上面非常相似的函数部分。

2012-08-09 15:14:03
用户9087568
用户9087568

@Bartek Banachewicz 的解答对我帮助很大。然而,我确实需要改变代码的顺序才能让它工作。我的代码显然与下面的代码不同,但是使用与上面相同的思路对我很有效。

请注意,我需要将if-else块移到迭代块内部,并检查类型v。

function DeepPrint (e)
-- 如果e是一个表,我们应该遍历它的元素
    for k,v in pairs(e) do -- 对于表中的每个元素
        if type(v) == "table" then
          print(k)
          DeepPrint(v)       -- 递归重复相同的过程
        else -- 否则,我们只需要打印它
          //EDIT: print(v .. k)
        end
    end
end

感谢您的指导。

2020-07-30 00:34:36