2011-12-06 3 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"라고 쓰면 당신이 말하는 것을 알기가 어렵습니다. 그런 다음 "창"과 "ovni"에 대해 언급하지만 이전에는 나타나지 않습니다. – 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