Способ чтения из переменной, имя которой не является константой, заключается в использовании единственного аргумента в виде набора:
set x1y {1 2 3 4}
set x2y {10 11 12 13}
foreach i {1 2} {
foreach val [set x${i}y] {
puts "$i --> $val"
}
}
Однако обычно проще создать псевдоним для переменной с помощью upvar 0
, вот так:
foreach i {1 2} {
upvar 0 x${i}y xy
foreach val $xy {
puts "$i --> $val"
}
}
И почти во всех случаях, когда вы делаете это, вы должны вместо этого использовать массивы (помня, что массивы Tcl являются ассоциативными массивами; вы можетеиспользуйте составные ключи, а также простые целые числа):
set xy(1) {1 2 3 4}
set xy(2) {10 11 12 13}
foreach i {1 2} {
foreach val $xy($i) {
puts "$i --> $val"
}
}
Возможно, вы захотите избегать использования eval
или subst
для такого рода вещей;эти команды имеют побочные эффекты, которые могут повредить стабильности вашего кода, если вы не будете осторожны.Определенно не для таких случаев, как эти.(Кроме того, они будут работать медленнее, поскольку заставляют Tcl чаще перекомпилировать свой внутренний байт-код. Все решения, которые я представляю выше, не имеют такой ошибки).