Печать нескольких переменных в tcl

#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}
  

Причина, по которой работает обратная косая черта, заключается в том, что не является «обычным» символом, и после прочтения вышеизложенного должно быть немного более очевидно, как все работало.


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

  1. :: : Обычно это используется для определения области видимости. Например, если у вас есть глобальная переменная с именем my_var , вы также можете использовать $::my_var для ссылки на нее. Здесь :: указывается Tcl, что my_var является глобальной переменной. Обратите внимание, что если их более двух : подряд, они не будут суммироваться:

     % set ::y 5
    5
    % set ::::y
    5
    % set :::y
    5
      

    :: обычно используется для определения пространства имен, в котором находится переменная. Например, $mine::var это переменная, вызываемая var в пространстве имен с именем mine .

  2. () : Они используются для массивов. $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', упомянутый в ответе Джерри, - это я, я использовал этот ник ранее.)