Нужна библиотека Tcl для чтения / записи файлов конфигурации - PullRequest
2 голосов
/ 08 ноября 2011

Мое приложение Tcl должно считывать и хранить множество параметров конфигурации. Я хотел бы использовать обычный файл на диске в качестве хранилища, а не реестра или чего-то еще.

Было бы здорово хранить параметры иерархически. Все мои параметры - это строки, числа и их списки. Конфигурационные файлы могут быть помещены в каталог (не только в домашний каталог пользователя). Обычно приложение ожидает файл конфигурации в текущем каталоге.

Знаете ли вы какую-либо готовую к использованию библиотеку Tcl?

Более общий вопрос: что такое "Tcl-way" для чтения / записи конфигурации приложения?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Если вам не нужен произвольный доступ (т. Е. Файлы конфигурации не очень большие, и каждый из них может быть полностью захвачен сразу) и не требуют обработки внешними инструментами, вы можете просто использовать плоские текстовые файлы, содержащие, скажем,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 (выДля этого нужно написать сериализатор) или форматы INI - все они доступны из Tcllib и, следовательно, являются простыми Tcl.

Еще более интересным может бытьиспользуя XML через TDOM (расширение C на основе экспата). SQLite , который уже был предложен, обладает еще большими возможностями (обеспечивает произвольный доступ к данным, способен работать с огромными массивами данных).Но кажется, что для вашей задачи эти инструменты кажутся слишком тяжелыми.

Обратите внимание, что мой пример намеренно показывает, как хранить / восстанавливать произвольный специальный список переменных, поэтому процедура cf_writeсоздает список Tcl, который будет храниться отдельно.Конечно, никто не мешает вам создать его самостоятельно, обеспечивая создание иерархических структур произвольной сложности.Одно предупреждение: в этом случае вы можете (или не можете) столкнуться с проблемой деконструкции восстановленного списка.Но если вы будете придерживаться общего правила, согласно которому каждый элемент является парой имя / значение, как в моем примере, деконструкция не должна быть сложной.

2 голосов
/ 08 ноября 2011

Если конфигурация не обязательно должна быть удобочитаемой для человека, я предлагаю вам рассмотреть Sqlite - он начинался как расширение Tcl, и, следовательно, привязки Tcl Sqlite являются более зрелыми, чем любой другой язык.

См .: http://www.sqlite.org/tclsqlite.html

1 голос
/ 09 ноября 2011

tcllib содержит пакет inifile для обработки файлов конфигурации формата файлов .ini. Поскольку он является частью tcllib, он должен быть доступен на всех платформах (я только что проверил, и он нормально загружается на моем Solaris 8). Он позволяет вам читать и записывать файлы .ini и получать доступ к конфигурации по разделам и ключам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...