1

我是 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]

   }
}

有什么解决办法吗?

4

3 回答 3

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 varnameor set $variable_with__varname

foreach不仅更快,而且更清楚你的意图。
有关更多信息,请参阅tcl.tk wiki

于 2013-08-20T08:36:40.513 回答
1

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

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

请注意,您需要先设置变量,然后再将它们放入列表中。

现在,如果你有 key key2,要获取 value value2,你可以使用你做的循环,做的有点不同:

set key "key2"
foreach i $mainlist {
    if {[lindex $i 0] == $key} {
         puts [lindex $i 1]
    }
}
于 2013-08-20T08:55:08.363 回答
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,在之后的版本中有更优化的方式。

于 2013-08-20T06:15:59.770 回答