2013-12-19 8 views
1

У меня есть следующая проблема:квадратные скобки в TCL массивы

set start "input[0]" 
set end "output[0]" 
set myArray($start,$end,pin) 1 
set x "input[0]" 
set y "output[0]" 
set test [array names myArray $x,$y,pin] 
puts "\n$test" 

вывод должен быть:

input[0],output[0] 

, но результат:

{} 

если я:

set test [array names myArray *,*,pin] 
puts "\n$test" 

выход:

input[0],output[0] 

Кроме того, если я заменю [] по {}ie.input{0},output{0} исходный код работает.

Может кто-нибудь, пожалуйста, скажите мне, что здесь происходит? Как избежать скобок []?

ответ

3

Ну, давайте посмотрим, что происходит здесь:

set start "input[0]" 

Это выполнит команду 0. Я не знаю, что это делает, но вы, возможно, этого не хотите. Или скопируйте скобки с \ или используйте {}, чтобы приложить имя.

То же самое относится и к

set end "output[0]" 
# ... 
set x "input[0]" 
set y "output[0]" 

Но это не выглядит, как у вас есть эта проблема.

Следующая вещь, что вы передаете шаблон Глоб к array names:

set test [array names myArray $x,$y,pin] 

Tcl использует [] в шаблонах Глоб для выбора символов, simmilar для регулярного выражения. Таким образом, ваш шаблон будет соответствовать только input0,output0,pin. Вы можете избежать этого, пропуская -exact переключатель в array names: (., Обратите внимание, что шаблон должен выглядеть input\[0\],input\[1\],pinпосле Tcl сделали все виды замещения)

set test [array names myArray -exact $x,$y,pin] 

Или вы можете избежать скобок снова с обратным косыми чертами

+0

Это работает для упомянутого выше случая. У меня есть еще один случай, когда я не могу использовать -точный: 'набор тестов [имен массивов MyArray $ х, $ у, *, длина]' -точная опция не может по понятным причинам здесь. Я не могу обойти квадратные скобки в $ x и $ y и * using -regexp. Любая идея о том, что здесь происходит? – user3119236

+1

@ user3119236 Почему вы вообще используете имена массивов? Мне кажется, что вы делаете что-то не так, и вам нужно сделать шаг назад и подумать, что вы пытаетесь сделать в целом. Возможно, размещение словаря внутри элемента массива было бы более подходящим или, возможно, отображением вещей как своего рода объекта? –

+0

Нас строковая карта, предшествующая всем вхождениям квадратной скобки по косе: set checkname [строка карты {\ [\\\ [\] \\\]} "$ x, $ y, *, length"] set test [array имена myArray $ checkname] – mkostya

Смежные вопросы