tcl: как использовать значение переменной для создания новой переменной - PullRequest
4 голосов
/ 23 октября 2009

вот пример того, что я пытаюсь сделать.

set t SNS
set ${t}_top  [commands that return value]

Хотите получить информацию, хранящуюся в $ {t} _top

puts “${t}_top”
 SNS_top  (really want the data stored there?)

Думал, что это было: $ {{$ t} _top}, возможно, это был perl, но {} внутри {} не работают.

Ответы [ 4 ]

7 голосов
/ 23 октября 2009

Одной из действительно интересных вещей в Tcl является то, что вы можете динамически создавать имена переменных, как вы делаете в вопросе, который вы опубликовали. Однако это усложняет написание и делает ваш код сложнее, чем необходимо для понимания.

Вместо того, чтобы пытаться выяснить, как сделать эквивалент $ {{$ t} _top}, возможно, лучше вообще избежать этой проблемы. Вы можете сделать это с помощью ассоциативного массива.

Например, вместо этого:

set t SNS
set ${t}_top  [commands that return value]
...
puts [set ${t}_top]

Сделайте это:

set t SNS
set top($t) [commands that return value]
...
puts $top($t)

Большинство людей согласны с тем, что последний пример гораздо более читабелен.

3 голосов
/ 23 октября 2009

попробуй

puts [set ${t}_top]
2 голосов
/ 23 октября 2009

Каждая строка кода в Tcl проходит этап замещения (в котором подставляются переменные, команды и т. Д.) Только один раз ... как правило. Таким образом, что-то вроде

set var1 1
set var2 var1
set var3 $$var2

не будет завершено с var3, равным 1, поскольку заменитель заменит "$$ var2" на "значение переменной с именем '$ var2' (в буквальном смысле)" и остановится.

Что вам нужно, чтобы идти по другому пути или заставить другой раунд замещения. Другой способ - избежать второго раунда замещения (как показано Джексоном):

set var3 [set $var2]

Здесь $ var2 заменяется во время подстановки на "var1" ... затем [set var1] возвращает 1 ... затем var3 устанавливается на значение "1" ... и все хорошо .

0 голосов
/ 03 ноября 2009

Синтаксис

puts [expr $${t}_top]

также работает и избегает использования операции set, поэтому синтаксическая ошибка не должна перезаписывать ваши данные.

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