#tcl
Вопрос:
Я хотел бы добавить это : var mylinechart = `{
в список
set myvar "var mylinechart = `{"
> var mylinechart = `{
lappend mylist $myvar
> var mylinechart = `{
ожидаемый результат не так уж и желателен… Мне бы хотелось, чтобы это :
{var mylinechart = `{}
Что я делаю не так?
Ответ №1:
Принтер tcl обычно не добавляет скобки вокруг внешнего списка или элементов списка, которые сами по себе не являются списками. Но если у вас есть многомерный список, то вы начинаете их видеть:
% set mylist [list a b c]
a b c
% lappend mylist [list $myvar]
a b c {var mylinechart = `{}
mylist
теперь это список из четырех элементов, последний из которых представляет собой список с одним элементом. Он по-прежнему создает обратную косую черту во всех пробелах, поэтому все это рассматривается как один элемент. Если вы делаете что-то вроде записи в файл и не хотите их видеть, вы можете использовать puts
этот элемент:
% puts [lindex $mylist 3 0]
var mylinechart = `{
Ответ №2:
Форматер списка Tcl предпочитает не использовать ни фигурные скобки, ни обратные косые черты, но если это не работает (возможно, потому, что элемент содержит пробел или другой метасимвол Tcl), то он использует фигурные скобки, но если это не работает (обычно потому, что элемент имеет несбалансированные фигурные скобки), то он использует обратные косые черты. Обратные косые черты-самый уродливый вариант, но он подходит для чего угодно.
В вашем примере значение имеет несбалансированную скобку. Это означает, что когда Tcl форматирует список, он использует обратные косые черты. Это может быть некрасиво, но это работает, и вы можете восстановить значение, lindex
поэтому оно должно быть правильным.
Tcl не дает вам контроля над правилами формата, которые он выбирает для использования при форматировании списка, по крайней мере, не на уровне сценария. (Возможно немного больше контроля, если вы будете копаться на уровне библиотеки C, но это не рекомендуется, и все, что вы когда-либо можете сделать по-настоящему безопасно, — это заставить вещи становиться уродливее. Вы не можете безопасно заставить его не использовать обратные косые черты.)
Чтобы усилить то, что вы хотели {var mylinechart = `{}
, это не очень хорошо сформированный список. (Я помещаю его в двойные кавычки ниже , чтобы я мог легко ввести его; это само по себе является признаком того, что это плохо.)
% set s "{var mylinechart = `{}"
{var mylinechart = `{}
% lindex $s 0
unmatched open brace in list