使用列表中成员的值作为Tcl中另一个列表的键

时间:2013-08-20 05:29:16

标签: tcl

我是Tcl的新手。我想在列表中使用元素值作为另一个列表的键。 如果我有:

set  mainlist  { list1 list2 }  
set  list1 { val1 val2 }
set  list1 { val3 val4 }

我想迭代主列表成员以获取list1和list2成员。

我试过以下但是没有用:

for {set i 0} {$i < [llength $list1]} {incr i}  {

  set  mem  [lindex $list1 $i] 

  for {set j 0} {$j < [llength $mem]} {incr j} {

     puts [lindex $mem $j]

   }
}

任何解决方案?

3 个答案:

答案 0 :(得分:2)

嗯,间接变量访问。请使用set

您的代码可以是:

set  mainlist  { list1 list2 }  
set  list1 { val1 val2 }
set  list2 { val3 val4 }

foreach mem $mainlist {
    foreach val [set $mem] {
        puts $val
    }
}

为什么不使用嵌套列表?

修改
您使用$mem,其值分别为list1list2。但是您尝试访问变量list1的内容,因此您必须使用set varnameset $variable_with__varname

foreach不仅更快,更清楚你有什么意图 有关详细信息,请参阅tcl.tk wiki

答案 1 :(得分:1)

我不太确定你要问的是什么,但是从你做的循环来看,似乎你想做这样的事情:

set list1 {key1 value1}
set list2 {key2 value2}
set mainlist [list $list1 $list2]

请注意,在将变量放入列表之前,需要先设置变量。

现在,如果您有密钥key2,要获取值value2,您可以使用您所做的循环,但有所不同:

set key "key2"
foreach i $mainlist {
    if {[lindex $i 0] == $key} {
         puts [lindex $i 1]
    }
}

答案 2 :(得分:0)

我认为没有必要使用“for”命令。 您可以使用以下,

 set  mainlist  { list1 list2 }  

 set list1_mem  [lindex $mainlist  0]
 foreach val1 $list1_mem {
  puts $val1
 }
 set list2_mem  [lindex $mainlist  1]
 foreach val2 $list2_mem {
   puts $val2
 }

我正在使用TCL 8.4,在版本之后有更优化的方法。