2013-07-11 5 views
5

क्या कोई तरीका है कि मैं पदानुक्रम स्ट्रिंग को तालिका रूप में परिवर्तित कर सकता हूं?लुआ पदानुक्रम स्ट्रिंग तालिका

मान लीजिए इनपुट A.B.C.D

ouput एक मेज जो इनपुट ऊपर पार करता होना चाहिए: A = {} A.B = {} A.B.C = {} A.B.C.D = {}

धन्यवाद।

+0

'स्थानीय टीबीएल =" एबीसीडी "' और '(फ़ंक्शन (एस, के) लोडस्ट्रिंग (एस .. ('}'): प्रतिनिधि (के))() अंत) ((tbl .. '। '): gsub ('%। ',' = {')) ' –

उत्तर

5

स्पष्ट समाधान स्ट्रिंग को पार्स करना और उस से पदानुक्रम तालिका बनाना होगा। लेकिन एक और चालाक समाधान है कि लुआ इसे आपके लिए करने दें। metamagic और समारोह वातावरण में गड़बड़ी का एक सा के साथ यह किया जा सकता है:

dump = require 'pl.pretty'.dump -- convenient table dumper from penlight 

function createtable(str) 
    local env_mt = {} 
    env_mt.__index = function(t, k) 
        rawset(t, k, setmetatable({}, env_mt)) 
        return rawget(t, k) 
        end 
    local env = setmetatable({}, env_mt) 
    local f = loadstring("return "..str) 
    setfenv(f, env) 
    f() 
    return env 
end 

dump(createtable "A.B.C.D") 

इस आउटपुट:

{ 
    A = { 
    B = { 
     C = { 
     D = { 
     } 
     } 
    } 
    } 
} 
5

@ greatwolf के जवाब सही है, लेकिन मैं के "पार्स करने" स्ट्रिंग अधिक स्पष्ट दृष्टिकोण पसंद करते हैं और टेबल का निर्माण कम जादू, और आप एक (संभवतः) उपयोगकर्ता परिभाषित स्ट्रिंग से लोड किए गए फ़ंक्शन को निष्पादित नहीं करते हैं, जो एक सुरक्षा समस्या होगी।

local createtable = function(str) 
    local top = {} 
    local cur = top 
    for i in str:gmatch("[^.]+") do 
    cur[i] = {} 
    cur = cur[i] 
    end 
    return top 
end 

(require "pl.pretty").dump(createtable("A.B.C.D")) 
+2

अच्छा। बस ध्यान दें कि 'ए' रचनात्मक द्वारा लौटाई गई तालिका नहीं है, लेकिन उस तालिका में एक फ़ील्ड है। – lhf

+0

हां, मैंने @ महानवॉल्फ के आउटपुट की प्रतिलिपि बनाई। यदि आप ए को वापस करना चाहते हैं तो आपको स्ट्रिंग के पहले भाग को छोड़ना होगा, उदा। पैटर्न को '"\" ([^।] +) में बदलकर "'। – catwell