#tcl #puts
#tcl #помещает
Вопрос:
Я должен напечатать несколько переменных в одной puts
вот так
puts "$n1_$n2_$n3_$n4"
где n1
, n2
, n3
, n4
— это 4 переменные.
Он не будет печатать и покажет ошибку n1_ : no such variable
Ожидаемый результат должен быть примерно таким (пример)
01_abc_21_akdd
Комментарии:
1. Понял: я попробовал ставить перед каждым
_
и у меня получилось. Вот так:puts "$n1_$n2_$n3_$n4
Ответ №1:
Имена переменных в Tcl могут быть любой строкой в Tcl, ограничений нет, но если вы хотите использовать специальные символы (те, которые не входят в диапазон a-z
, 0-9
и _
, и буквы на разных языках в зависимости от платформы и локали), вам придется либо заключить имена выражений в квадратные скобки, либо использовать другие обходные пути (например, с ответом Hoodiecrow).
Это означает, что если у вас есть переменная с именем abc.d
, и если вы используете $abc.d
, механизм Tcl попытается найти переменную, $abc
потому что .
это не «обычный» символ.
Но если у вас есть переменная с именем abc
и вы используете $abcd
или $abc_d
, то движок начнет поиск переменных abcd
or abc_d
и not abc
.
Из-за этого вам придется использовать фигурные скобки между именем переменной, например:
${n1}
Причина, по которой работает обратная косая черта, заключается в том, что
не является «обычным» символом, и после прочтения вышеизложенного должно быть немного более очевидно, как все работало.
Есть несколько вещей, которые все же могут входить в имена переменных, которые не нуждаются в привязке и все еще что-то значат, за исключением того, что что-то «особенное»:
-
::
: Обычно это используется для определения области видимости. Например, если у вас есть глобальная переменная с именемmy_var
, вы также можете использовать$::my_var
для ссылки на нее. Здесь::
указывается Tcl, чтоmy_var
является глобальной переменной. Обратите внимание, что если их более двух:
подряд, они не будут суммироваться:% set ::y 5 5 % set ::::y 5 % set :::y 5
::
обычно используется для определения пространства имен, в котором находится переменная. Например,$mine::var
это переменная, вызываемаяvar
в пространстве имен с именемmine
. -
()
: Они используются для массивов.$arr(key)
это переменная, состоящая из двух частей: имени массиваarr
и имени ключаkey
. Примечание: у вас может быть массив с именеми ключ с именем
, потому что...
% set () abc abc % puts $() abc % array get "" {} abc
Может быть еще несколько, но это основы, на которые вы могли бы обратить внимание.
Ответ №2:
Два других способа:
puts "${n1}_${n2}_${n3}_${n4}"
puts [format "%s_%s_%s_%s" $n1 $n2 $n3 $n4]
Документация: формат
(Примечание: 'Hoodiecrow', упомянутый в ответе Джерри, - это я, я использовал этот ник ранее.)