2012-08-09 167 views
2

我一直在学习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: etc...etc.... 

我使用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 

正如你可以看到下面的索引是整数和VALES另一个表。

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的迭代所有存储在表在机器人列表中。

第二我为冗长的电子邮件appologise,但我仍然试图学习/理解这一点....我没有以前的编程/脚本体验。

感谢

回答

7

如果你要打印的表列表,然后将每个表的内部,然后再(很像以来),最简单的方法是使用递归

您将需要检查表的当前元素的类型,你正在寻找:

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的手动,一切都在那里解释。 //编辑:我应该更清楚;手册中有一节包含与上述非常类似的功能。

+0

啊RTFM'd! :D 我有阅读手册,甚至买了一本书!但是,目前的超低噪音技术,我希望手册等我学得越多越有意义。感谢您回答我的问题。 – Teknetik 2012-08-09 15:23:02

+0

现在我害怕,如果我真的**帮助**你发布完整的答案。请**请理解**我发布的代码。 – 2012-08-09 15:24:18

+0

我想了解我的信任:) 没有意义的只是复制粘贴...你说的是几乎完美的意义,但是我不确定我使用的LUA的实现有DeepPrint功能(lua interpriter与软件) – Teknetik 2012-08-09 15:42:09