【问题标题】:Lua- Iterating nested tableLua-迭代嵌套表
【发布时间】:2012-08-09 15:00:01
【问题描述】:

我已经学习 Lua 几个星期了,这是我一次又一次的症结所在。我已尝试阅读有关此主题的帖子和书籍。

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

我不会发布整个输出,但这里有一个我认为可以描述结构的 sn-p:

表引用是“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: etc...etc....

我使用我在这个论坛上找到的 tdump 函数来实现这一点。

for k,v in pairs(h_resp) do
print(k.."    ",v)
end

给我顶层,这个我明白。

domain    nevil-nmsdom
robotlist    table:0x22136a0

然后我尝试获取“机器人列表”

for k,v in pairs(h_resp.robotlist) do
print(k.."    ",v)
end

正如您在下面看到的,索引是整数,并且是另一个表的值。

  1    table:0x237e530
  0    table:0x22112a0
  3    table:0x2211460
  2    table:0x2392ee0
  5    table:0x2213e80
  4    table:0x22130e0
  7    table:0x2283b80
  6    table:0x2283ff0
  8    table: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
  ...etc...etc...

就我而言,我无法弄清楚如何让 Lua 遍历存储在 robotslist 中的所有表。

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

谢谢

【问题讨论】:

    标签: lua


    【解决方案1】:

    如果要打印表格列表,然后打印每个表格的内部,然后再打印一次(很像 inception),最简单的方法是使用 recursion

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

    function DeepPrint (e)
        -- if e is a table, we should iterate over its elements
        if type(e) == "table" then
            for k,v in pairs(e) do -- for every element in the table
                print(k)
                DeepPrint(v)       -- recursively repeat the same procedure
            end
        else -- if not, we can just print it
            print(e)
        end
    end
    

    你应该看看 Lua 手册,那里都有解释。 //编辑:我应该更清楚;手册中有一节包含与上述非常相似的功能。

    【讨论】:

    • 啊,RTFM 了! :D 我已经阅读了手册,甚至买了一本书!但目前是一个超级菜鸟,我希望我学到的越多,手册等就越有意义。感谢您抽出宝贵时间回答我的问题。
    • 现在恐怕如果我真的通过发布完整答案来帮助你。请理解我发布的代码。
    • 我试图理解相信我 :) 没有意义只是复制粘贴......你解释的几乎完全有道理,但是我不确定我正在使用的 LUA 的实施是否具有 DeepPrint 功能( lua解释器与软件捆绑在一起)
    • 这就是重点——你必须自己写。由于许多原因,Lua 往往缺乏各种“标准”功能。 Lua 用户 Wiki 是关于“为什么 X 不在标准库中”的一个很好的信息来源。它通常提供上述功能的参考实现。
    • @CarlDraper 您的表中可能有一个元表。 pairs() 不会遍历通过元表 __index 函数或表找到的键。如果您不知道我在说什么,请阅读Lua manual :)
    【解决方案2】:

    @Bartek Banachewicz 的回答对我帮助很大。但是,我确实必须更改代码的顺序才能使其正常工作。我的代码显然与下面不同,但使用与上面相同的想法对我有用。

    注意我需要将 if-else 块移动到迭代块中并检查类型 v。

    function DeepPrint (e)
    -- if e is a table, we should iterate over its elements
        for k,v in pairs(e) do -- for every element in the table
            if type(v) == "table" then
              print(k)
              DeepPrint(v)       -- recursively repeat the same procedure
            else -- if not, we can just print it
              //EDIT: print(v .. k)
            end
        end
    end
    

    感谢您的指导

    【讨论】:

    • 这没有任何意义;为什么将类型检查移到循环内?原始代码适用于任何表(甚至任何对象),但是当给定数组或给定具有数组值的表时(例如,{ x = { 1, 2 }, y = { 3, 4 } } 将失败),此代码无法正常工作。当给定表格以外的任何内容作为输入时,它会灾难性地失败。您想通过移动支票解决什么问题?
    • 其实你是对的。在第 8 行的代码中,我没有 print(e) 而是 print(tostring(k) .. ":" .. tostring(v))。我现在无法解释为什么,但是我无法使用之前提供的代码获得任何结果;它只是处于无限循环中。更改订单后,我收到了我正在搜索的结果。我需要进一步研究以帮助理解原因。
    • 这是我正在遍历的 json 示例。它取自fitibit。 {"sleep":[{"dateOfSleep":"2019-11-30","duration":16620000,"efficiency":96}]}。使用简单的对迭代我能够收到sleep:table:(memory address)。使用原始呈现的递归函数,我根本没有收到结果。我决定先开始遍历,然后递归到达第二张桌子。使用我列出的这种方法对我有用,并给了我想要的结果。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多