Tcl добавляет фигурные скобки при использовании знака `$`

set B {pc_0::!mx_0 pi::$mx_0}
puts $B

set A ""
foreach x $B {
    lappend A $x
}

puts $A

Выход этой программы

pc_0::!mx_0 pi::$mx_0
pc_0::!mx_0 {pi::$mx_0}

Странно, что tcl добавляет фигурные скобки во второй вывод. Я думаю, это потому, что он использует $ условное обозначение. Но я действительно должен использовать это, и я не хочу, чтобы скобки были вставлены. Как это можно объяснить и как избежать брекетов?

2 ответа

Решение

Как правило, не рассматривайте списки как строки. Притворись, что у них нет строкового представления. (Строковое представление полезно только для сериализации, отладки, но не для пользователя).

Для преобразования текста (особенно пользовательского ввода) в список используйте split,
Чтобы преобразовать его обратно, используйте join,

Су вы хотите:

puts [join $A]

Фон:

Побочным эффектом списка является экранирование всех метасимволов, используемых Tcl, поэтому дальнейшая замена не происходит, когда вы eval этот список Это очень важное свойство для генерации обратных вызовов / кода, который будет выполнен позже:

set userinput [gets stdin]
set code [list puts $userinput]
eval $code

Независимо от того, что пользователь вводит здесь, вывод всегда совпадает с введенным пользователем, без какой-либо замены.

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

Почему бы не распечатать список способом, подобным тому, как он был создан?

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

foreach x $A {
    puts $x
}
Другие вопросы по тегам