TCL Получить значение переменной второго уровня - PullRequest
0 голосов
/ 04 июня 2019

Я застрял с проблемой TCL. Я хотел бы иметь доступ к содержимому переменной второго уровня с сохранением формата (списка). пожалуйста, смотрите мой код: Во-первых, я объявляю содержимое переменной

set x1y {1 2 3 4}
set x2y {10 11 12 13}

После выполнения цикла for

for { i 0} {i < 4} { incr i}

Я хотел бы иметь в переменной xy содержимое x1y с сохранением формата списка

 set xy [eval ["x${i}y"]]
 foreach x $xy {
  ....
 }

У вас есть идея / предложение? Я пробовал субстрат, но он не сохраняет формат. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Способ чтения из переменной, имя которой не является константой, заключается в использовании единственного аргумента в виде набора:

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 чаще перекомпилировать свой внутренний байт-код. Все решения, которые я представляю выше, не имеют такой ошибки).

0 голосов
/ 04 июня 2019
set x1y {1 2 3 4}
set x2y {10 11 12 13}
for {set i 1} {$i <= 2} {incr i} {
     foreach e [set x${i}y] {
            puts $e
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...