2011-11-08 4 views
1

Tcl 응용 프로그램은 많은 구성 매개 변수를 읽고 저장해야합니다. 정기적 인 디스크 파일을 저장소가 아닌 저장소로 사용하고 싶습니다.구성 파일을 읽고 쓰는 Tcl 라이브러리 필요

매개 변수를 계층 적으로 저장하는 것이 좋습니다. 모든 매개 변수는 문자열, 숫자 및 목록입니다. 구성 파일은 디렉토리 (사용자의 집뿐 아니라)에 배치 될 수 있습니다. 일반적으로 응용 프로그램은 현재 디렉토리의 구성 파일을 필요로합니다.

바로 사용할 수있는 Tcl 라이브러리를 알고 있습니까?

더 일반적인 질문 : 응용 프로그램 구성을 읽고 쓰는 "Tcl- 방식"은 무엇입니까?

감사합니다.

답변

1

tcllib에는 .ini 파일 형식 구성 파일을 처리하기위한 패키지 inifile 패키지가 포함되어 있습니다. tcllib의 일부이므로 모든 플랫폼에서 사용할 수 있어야합니다 (필자는 Solaris 8 상자에서 확인했는데 ok를로드합니다). .ini 파일을 읽고 쓸 수 있으며 섹션과 키별로 구성에 액세스 할 수 있습니다.

2

구성이 사람이 읽을 수 있어야 할 필요가 없다면 Sqlite를 Tcl 확장으로 시작 했으므로 Tcl의 Sqlite 바인딩이 다른 언어보다 성숙한 것이 좋습니다.

참조 : http://www.sqlite.org/tclsqlite.html

1

당신이 랜덤 액세스를, 외부 도구에 의해 처리를 필요로하지 않는 당신은 단지 수 (즉, 구성 파일이 큰 아니며, 각각 완전히 한 번에 slurped 될 수있다)이 필요하지 않은 경우 예를 들어, Tcl리스트가 들어있는 플랫 텍스트 파일을 사용하십시오. "트릭"은 Tcl에서 각 값은 유효한 문자열 표현 (요청시)을 가져야하며 문자열 표현으로 재구성 될 수 있다는 것입니다. 당신은 그것을 무료로 얻을 수 있습니다. 즉, 특별한 패키지가 필요하지 않습니다. 그리고 당신이 제공해야만하는 것은 직렬화 된 값을 그들의 이름에 묶는 일종의 구조입니다.

는 설명하기 위해 :

set a "a string" 
set b 536 
set c {this is a list {with sublist}} 

proc cf_write {fname args} { 
    set fd [open $fname w] 
    chan config $fd -encoding utf-8 
    set data [list] 
    foreach varName $args { 
    upvar 1 $varName var 
    lappend data [list $varName $var] 
    } 
    puts $fd $data 
    close $fd 
} 

proc cf_read fname { 
    set fd [open $fname] 
    chan config $fd -encoding utf-8 
    set data [read $fd] 
    close $fd 
    set data 
} 

set cfile [file join [file dir [info script]] conf.txt] 
cf_write $cfile a b c 
foreach entry [cf_read $cfile] { 
    lassign $entry name value 
    puts "$name: $value" 
} 

당신은이 출력을 얻을 것이다 : 이제 당신이 더 많은 공상 또는 "상호 운용"뭔가있는 같이 느끼는 경우에

a: a string 
b: 536 
c: this is a list {with sublist} 

를, '당신에게 (YAML 또는 JSON보고 이 경우 serializer를 작성해야합니다.) 또는 INI 형식 - 모두 Tcllib에서 사용할 수 있으므로 일반 Tcl입니다.

TDOM (expat 기반 C 확장자)을 통해 XML을 사용할 수도 있습니다. 이미 제안 된 SQLite은 그보다 훨씬 더 능력이 있습니다 (데이터에 대한 임의 액세스를 제공하고 거대한 데이터 배열에서 작동 할 수 있습니다). 그러나 귀하의 업무에있어 이러한 도구는 너무 무거운 것처럼 보입니다.

이 예제에서는 cf_write 프로 시저가 자체적으로 저장되는 Tcl 목록을 작성하도록 임의의 임시 변수 목록을 저장/복원하는 방법을 일부러 선택하는 점을 유의하십시오. 물론, 아무도 당신이 임의의 복잡성의 계층 적 구조의 생성을 위해 제공하는 것을 막을 수 없습니다. 한 가지주의 할 점은이 경우 복원 된 목록의 해체 문제에 직면 할지도 모를 수도 있다는 것입니다. 그러나 제 예제 에서처럼 각 요소가 이름/값 쌍이라는 일반적인 규칙을 고수한다면 해체는 어렵지 않습니다.

+1

계층 적 형식의 또 다른 옵션은 [treeql] (http : // tcllib.)과 결합 된 tcllib [struct :: tree] (http://tcllib.sourceforge.net/doc/struct_tree.html) 패키지입니다. sourceforge.net/doc/treeql.html) 패키지에 있습니다. – schlenk

+0

@schlenk, 오, 흥미 롭습니다, 포인터 주셔서 감사합니다. – kostix

+0

JSON 시리얼 라이저를 작성했지만, 정말 까다로운 8.6 요구 사항을 수행합니다. –

관련 문제