TCL - список с переменными - PullRequest
       12

TCL - список с переменными

0 голосов
/ 14 сентября 2018

У меня проблемы с созданием списка списков, который содержит смесь текста и переменных в TCL. У меня есть пользовательская переменная ввода, которую я затем хочу включить в список. Я пропущу опцию выбора пользователя для краткости.

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 $CheckVal"
}

Результирующий вывод:
Порог составляет $ 100 * Порог $ b

Желаемый вывод:
Порог 0,1
Порог 20,0

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Хотя методы, предложенные Питером Леверином, работают, они должны использоваться только в качестве крайней меры.Обычно вы используете некоторые команды, которые работают со списками, для создания списка списков.Я полагаю, что именно на это намекал Гленн Джекман.

В зависимости от вашего фактического кода, я бы, вероятно, использовал list и / или lappend:

set c {}
lappend c \
  [list text1 text2 $a text3] \
  [list text4 text5 $b text6]

Тогда foreach будетработай так, как ты написал.

0 голосов
/ 14 сентября 2018

Две альтернативы:

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, но не переходите туда).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...