У меня есть файл, как это:выполнить TCL команд построчно
set position {0.50 0.50}
set visibility false
set text {ID: {entity.id}\n Value: {entity.contour_val}}
И я хочу сделать что-то похожее на источник, но я хочу использовать дескриптор файла только.
Моя текущая попытка выглядит следующим образом:
proc readArray {fileHandle arrayName} {
upvar $arrayName arr
set cl 0
while {! [eof $fileHandle]} {
set cl [expr "$cl + 1"]
set line [gets $fileHandle]
if [$line eq {}] continue
puts $line
namespace eval ::__esg_priv "
uplevel 1 {*}$line
"
info vars ::__esg_priv::*
foreach varPath [info vars ::__esg_priv::*] {
set varName [string map { ::__esg_priv:: "" } $varPath]
puts "Setting arr($varName) -> [set $varPath]"
set arr($varName) [set $varPath]
}
namespace delete __esg_priv
}
puts "$cl number of lines read"
}
На месте uplevel я перепробовал много комбинаций Eval и цитирование. Моя проблема в том, что она либо терпит неудачу на линиях со списками, либо не устанавливает переменные. Каков правильный способ сделать это, если ожидается, что исполняемые команды будут действительными.
Дополнительный вопрос: как правильно применить проверку ошибок, которую я еще не пробовал.
После вызова
readArray [open "myFile.tcl" r] arr
Я ожидаю, что
parray arr
вопросы что-то вроде:
arr(position) = 0.50 0.50
arr(text) = ID: {entity.id}\n Value: {entity.contour_val}
arr(visibility) = false
КСТАТИ: Последняя строка содержит внутренние {}, которые, как предполагается, превратите его в строковые переменные. И нет намерения сделать это диктоном.
Спасибо за все ценные комментарии и улучшения. Хотя, похоже, он все еще не делает то, что я хочу. Я попытаюсь отредактировать вопрос, чтобы сделать его более ясным. – Ingo
@Ingo: результат, который вы ожидаете, это именно то, что я получаю, когда запускаю свой код и печатаю массив. Что вы получаете? –
Интересно. Массив для меня не определен. Я дважды проверю. – Ingo