3

私はここ数週間Luaを学んでいますが、これは何度も何度も私の1つのこだわりのポイントです。私はこのトピックに関する投稿や本を読んでみました。

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

それから私は「ロボットリスト」を取得しようとします

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

また、次を使用して、これらの「ネストされた」テーブルの1つに対処できるという事実もわかります。

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...

私のポイントでは、robotlistに格納されているすべてのテーブルを反復処理するようにLuaに依頼する方法を理解できません。

第二に、私は長らく曲がりくねった電子メールをお詫びしますが、私はまだこれを学び/理解しようとしています....私は以前のプログラミング/スクリプトの経験がありません。

ありがとう

4

2 に答える 2

9

テーブルリストを印刷し、次にすべてのテーブルの内部を印刷し、次に(最初のように)もう一度印刷する場合、最も簡単な方法は再帰を使用することです。

表示しているテーブルの現在の要素のタイプを確認する必要があります。

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のマニュアルをご覧ください。すべてがそこで説明されています。//編集:もっと明確にする必要があります; マニュアルには、上記と非常によく似た機能を含むセクションがあります。

于 2012-08-09T15:14:03.797 に答える
0

@BartekBanachewiczの答えは私を大いに助けてくれました。ただし、コードを機能させるには、コードの順序を変更する必要がありました。私のコードは明らかに以下とは異なりましたが、上記と同じアイデアを使用すると、これでうまくいきました。

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

指導ありがとうございます

于 2020-07-30T00:34:36.203 に答える