2013-07-11 3 views
5

내가 계층 구조 문자열을 테이블 형식으로 변환 할 수있는 방법이 있습니까? 테이블에 루아 계층 구조 문자열

는 입력 A.B.C.D

OUPUT 입력 위에서 횡단 테이블이다되어야한다고 가정 A = {} A.B = {} A.B.C = {} A.B.C.D = {}

감사.

+0

'로컬 TBL = "ABCD"'및 '(함수 (S, K) loadstring (S .. ('} ') 담당자 (K))() 단부) ((TBL .. ". ') : gsub ('%. ','= { '))' –

답변

5

확실한 해결책은 문자열을 구문 분석하고 그로부터 계층 구조 테이블을 구성하는 것입니다. 그러나 더 현명한 해결책은 루아가 당신을 위해 그것을하도록하는 것입니다. 메타 매직과 기능 환경 조작의 비트와 함께이 작업을 수행 할 수 있습니다

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

니스. 'A'는 createtable에 의해 반환 된 테이블이 아니라 그 테이블의 필드입니다. – lhf

+0

예, @ greatwolf의 결과물을 복사했습니다. A를 반환하려면 문자열의 첫 번째 부분을 건너 뛰면됩니다 (예 : 패턴을''\. ([^.] +) "'로 변경하십시오. – catwell