2011-12-06 13 views
-1

だから私はかなりのジレンマを持っています。私は、例えば、一定のMSGを読み取るコードを持っている:ルアテーブル(配列または辞書テーブル)の文字列のインデックスを保存

m.content:sub(1,8) == 'Loot of ' then 

読み取り:

01:50 Loot of a starving wolf: a dirty fur, a salad, 2 pancakes, 60 gold 

は今、私はそれがテーブルに挿入しようとしています。私がこれまでに持っていた問題は、文字列の型を数えてテーブル内で比較してインデックスを追加することができないということです。例えば

foreach newmessage m do 
m.content:sub(1,8) == 'Loot of ' then 

、その後、私は迷ってしまいました:

t = {dirty fur="quantity of msgs that show this",insert a new msg="how many times haves appear} 

私がこれまで取り組んできたことです。私はこのテーブルを作る方法を知らない。それはローカルでなければならないと私は信じていますが、私が持っている主な問題は、それをペアで印刷したくないということです.1から#tableまでの値を挿入順に呼び出す必要があります。それが私の痛みが始まる場所です。

私が何かしたい:

table msgs = {spear='100',something='2', ovni='123'} 

ので、私はこのテーブルを取得するときに(私はまだ作ることができないが)、私はそれだけでなく、私はテーブルを呼び出したい、別の機能のために同じテーブルを呼び出すことができます。 "xmsg" =数量。誰かが私が求めていることを理解してくれることを願っています。

function loot() 
foreach newmessage m do 
     if m.type == MSG_INFO and m.content:sub(1,8) == 'Loot of ' then 
     local content = (m.content:match('Loot of .-: (.+)')):token(nil,', ') 
     for i,j in ipairs(content) do 
     return content 
     end 
     end 
    end 
end 
この機能の

リターンのMSG:

{"3 gold coins"} 
{"3 gold coins"} 
{"nothing"} 
{"6 gold coins", "a hand axe"} 
{"12 gold coins", "a hand axe"} 
+1

実例であなたの例を書き直すことはできますか?あなたが "asdf"と書いている場合、あなたが話していることを知るのは難しいです。それからあなたは "槍"と "オビ"と言いますが、それらはあらかじめ現れていません。 – kikito

+0

[SSCCE](http://sscce.org/)で自分自身をよりよく説明することができます。 –

答えて

1
TEST_LOG = [[ 
01:50 Loot of a starving wolf: a dirty fur, a large melon, a cactus 
02:20 Loot of a giant: a large melon, an axe 
03:30 You are on fire! Not really, this is just a test message 
04:00 Loot of a starving wolf: a dirty fur, a tooth, a bundle of hair 
04:00 Loot of a starving wolf: a dirty fur, a tooth, an axe 
]] 

ENEMY_LOOT_COUNTS = {} 
LOOT_COUNTS = {} 

for line in string.gmatch(TEST_LOG, "([^\n]+)\n") do 
    local time, msg = string.match(line, "(%d%d:%d%d) (.+)$") 
    if msg and msg:sub(1, 8) == "Loot of " then 
     local enemy_name, contents = string.match(msg, "^Loot of a ([^:]+): (.+)$") 
     local enemy_t = ENEMY_LOOT_COUNTS[enemy_name] 
     if not enemy_t then 
      enemy_t = {} 
      ENEMY_LOOT_COUNTS[enemy_name] = enemy_t 
     end 
     local items = {} 
     for item_name in string.gmatch(contents, "an? ([^,]+)") do 
      items[#items+1] = item_name 
      enemy_t[item_name] = (enemy_t[item_name] or 0)+1 
      LOOT_COUNTS[item_name] = (LOOT_COUNTS[item_name] or 0)+1 
     end 
    else 
     -- you can handle other messages here if you want 
    end 
end 

for enemy_name, loot_counts in pairs(ENEMY_LOOT_COUNTS) do 
    local s = "Enemy "..enemy_name.." dropped: " 
    for item_name, item_count in pairs(loot_counts) do 
     s = s..item_count.."x "..item_name..", " 
    end 
    print(s) 
end 

do 
    local s = "Overall: " 
    for item_name, item_count in pairs(LOOT_COUNTS) do 
     s = s..item_count.."x "..item_name..", " 
    end 
    print(s) 
end 

を、私はこのコードを伴うために長い答えを書きたかったが、私は申し訳ありません、今時間がありません。 後でやります。

+0

私はこれらの文字列を返すコードを持っているので、時間や生き物を読む必要はありません。今は私の問題です。あなたが私に与えたコードの部分でうまくいくことはできませんでした。これらのメッセージ { "3つの金貨"} { "3つの金貨"} { "何もない"} { "6つの金貨"、 "手の斧"} { "12金をカウントするカウンタのあなたのタイプコイン "、"手斧 "} – Wesker

関連する問題