в tcl не может прочитать переменную, если ее имя состоит из другой переменной - PullRequest
3 голосов
/ 13 декабря 2010

В основном то, что я делаю, это

set i 0

set log_$i "blah blah"

puts $log_$i;                  # expecting to see "blah blah"

возвращает ошибку:

не может прочитать "log_": такой переменной нет

Я пробовал все виды группировки, похоже, ничего не работает

Ответы [ 3 ]

11 голосов
/ 13 декабря 2010

Проблема, с которой вы столкнулись, заключается в том, что замена $ останавливается, когда встречается $ (и множество других знаков препинания).

Чтобы сделать то, что вы делаете, вы 'd сделать это, чтобы прочитать переменную (используя форму с одним аргументом команды set):

puts [set log_$i]

, которая компилируется именно в тот тип байт-кода, который вы ожидаете.

НО…

Не делайте так, если вы можете избежать этого.

Каждый раз, когда вы думаете о создании таких переменных, вы становитесь болеевероятно, понадобится использовать массивы:

set i 0
set log($i) "blah blah"
puts $log($i)

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

set i 0
upvar 0 log_$i v
set v "blah blah"
puts $v

upvar команда сложная штука, и позволяет использовать всевозможные действительно мощные приемы.Это также делает локальные псевдонимы переменных очень эффективными (хотя этот псевдоним не включает поиск переменной каждый раз; вам нужно будет повторно запустить upvar, если вы хотите, чтобы псевдоним указывал на что-то еще).

0 голосов
/ 26 июня 2019

Другой способ:

% set i 0
0
% set log(0) "blah blah"
blah blah
% puts $log($i)
blah blah
0 голосов
/ 30 декабря 2010

Другой способ сделать это

==> tclsh

% set i 0

0

% set log[set i] bb

bb

% puts "[set log[set i]]"

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