В TCL, как заставить переменную использовать значение другой переменной - PullRequest
3 голосов
/ 12 мая 2009

Мне нужно использовать значение переменной внутри другой переменной.

Это то, что я пытался ..

set cmd_ts "foo bar"
set confCmds {
    command1
    command2
    $cmd_ts
}
puts "confCmds = $confCmds"

Но вместо получения

confCmds = 
    command1
    command2
    foo bar

Я получаю:

confCmds =
    command1
    command2
    $cmd_ts

P.S. Я попробовал следующее безрезультатно

  1. $ cmd_ts
  2. "$ cmd_ts"
  3. {$ cmd_ts}
  4. \ $ cmd_ts

Ответы [ 3 ]

9 голосов
/ 12 мая 2009

(почти) ничего не будет работать, пока вы используете фигурные скобки. Лучшее предложение - использовать команду list:

set confCmds [list command1 command2 $cmd_ts]

Я говорю (почти), потому что вы можете использовать subst для подстановки переменных в confCmds, но это не совсем то, что вам нужно, и это чревато опасностью. То, что вы хотите, это список слов, одно или несколько из которых могут быть определены переменной. Это именно то, что дает вышеуказанное решение.

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

set confCmds [list \
    command1 \
    command2 \
    $cmd_ts \
]

Это решение предполагает, что вам нужен список tcl. Это может или не может быть то, что вы хотите, все зависит от того, как вы обрабатываете эти данные вниз по течению.

В комментарии вы написали, что вам действительно нужна строка разделенных новой строкой элементов, в этом случае вы можете просто использовать двойные кавычки, например:

set confCmds "
    command1
    command2
    $cmd_ts
"

Это даст вам строку с несколькими строками, разделенными символами новой строки. Будьте осторожны, пытаясь рассматривать это как список команд (то есть: не делайте 'foreach foo $ confCmds'), потому что он может завершиться ошибкой в ​​зависимости от того, что находится в $ cmd_ts.

4 голосов
/ 12 мая 2009

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

Если вы хотите сделать что-нибудь полезное с командами, вы, вероятно, хотите, чтобы они были в виде списка, но если вы просто хотите, чтобы они разделялись новой строкой, сделайте это в конце:

set confCmds [join $confCmds "\n"]
2 голосов
/ 12 мая 2009

Если вы должны иметь список, определенный так, как он есть, вы также можете использовать команду subst, которая выполнит замену, которую предотвращают фигурные скобки:

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