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
}