LINUX.ORG.RU

[TCL] Обращение к элементу массива

 


0

1

Есть масив

> parray [lindex $q 0]
host1(cpu_cores) = 2
host1(memory)    = 4069

Собственно, имя массива и его значения берутся из заранее существующего списка q

host1 {cpu_cores 2 memory 4069}

Вопрос, как в таком случае обратится к элементу массива явно не указывая его имя host1, а зная, что имя массива храниться в

[lindex $q 0]
?

Ответ на: комментарий от anonymous

puts [subst $[lindex $q 0](cpu_cores)]

Тут есть странность, если массив host1 будет с именем host.1, то появится ошибка

can't read "host": no such variable
    while executing
"subst $[lindex $q 0](cpu_cores)"
    invoked from within
"puts [subst $[lindex $q 0](cpu_cores)]"
    (file "./test-json.tcl" line 26)

macumazan ★★
() автор топика
Ответ на: комментарий от macumazan

>> puts [lindex $q 0](cpu_cores)

host1 {cpu_cores 2 memory 4069}(cpu_cores)

puts [set [lindex $q 0](cpu_cores)]

Led ★★★☆☆
()

«array get» хотя это и не элегантно выглядит :)

set q {host1 {cpu_cores 2 memory 4069}}
eval array set $q
puts ""
puts [array get [ lindex $q 0 ]]
puts [array get [ lindex $q 0 ] cpu_cores]
puts [lindex [array get [lindex $q 0] cpu_core ] 1]

можно придать «элегантности» через interp alias,

НО если приходится имя массива вычислять, то лучше использовать длинные ключи одного массива, чем несколько разноимённых массивов.

set q {host1 {cpu_cores 2 memory 4069}
       host2 {cpu_cores 1 memory 1024}}
foreach {host spec} $q {
  foreach {key value} spec {
    set hostinfo($host,$key) $value
  }
}
puts $hostinfo(host1,cpu_cores)
puts $hostinfo([lindex $q 0],cpu_cores)
puts [array get hostinfo -glob host1,*]

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

>НО если приходится имя массива вычислять, то лучше использовать длинные ключи одного массива, чем несколько разноимённых массивов.

+1

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.