Две альтернативы:
set a 0.1
set b 20.0
set c {
{text1 text2 a text3}
{text4 text5 b text6}
}
foreach i $c {
set CheckVal [lindex $i 2]
puts "Threshold is [set $CheckVal]"
}
Сохраните имя переменной вместо значения и получите значение путем двухэтапной замены ($$Checkval
не работает, но [set $CheckVal]
работает) вputs
вызов.
set a 0.1
set b 20.0
set c {
{text1 text2 $a text3}
{text4 text5 $b text6}
}
foreach i $c {
set CheckVal [lindex $i 2]
puts [subst "Threshold is $CheckVal"]
}
Это двойное замещение, а не двухэтапное замещение.Это выглядит просто, но subst
на самом деле немного хитро и почти в крайнем случае.
Независимо от того, какое решение вы используете, такая схема, где вы храните ссылку на значение переменной вструктура является хрупкой, поскольку она зависит от исходной переменной, находящейся в области видимости и все еще существующей при разыменовании ссылки.По крайней мере, вы должны хранить полное имя (пространство имен и имя) в вашем списке.Если переменная является локальной переменной, вам нужно использовать ее во время того же вызова, что и при ее сохранении (или далее вверх по стеку вызовов, используя upvar
, но не переходите туда).