Проблема, с которой вы столкнулись, заключается в том, что замена $
останавливается, когда встречается $
(и множество других знаков препинания).
Чтобы сделать то, что вы делаете, вы 'd сделать это, чтобы прочитать переменную (используя форму с одним аргументом команды set
):
puts [set log_$i]
, которая компилируется именно в тот тип байт-кода, который вы ожидаете.
НО…
Не делайте так, если вы можете избежать этого.
Каждый раз, когда вы думаете о создании таких переменных, вы становитесь болеевероятно, понадобится использовать массивы:
set i 0
set log($i) "blah blah"
puts $log($i)
, что работает .И если вам действительно нужно работать с переменной, имя которой составлено, часто проще создать (обычно локальную) переменную псевдонима для нее следующим образом:
set i 0
upvar 0 log_$i v
set v "blah blah"
puts $v
upvar
команда сложная штука, и позволяет использовать всевозможные действительно мощные приемы.Это также делает локальные псевдонимы переменных очень эффективными (хотя этот псевдоним не включает поиск переменной каждый раз; вам нужно будет повторно запустить upvar
, если вы хотите, чтобы псевдоним указывал на что-то еще).