我是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]
}
}
任何解决方案?
答案 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
,其值分别为list1
或list2
。但是您尝试访问变量list1
的内容,因此您必须使用set varname
或set $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,在版本之后有更优化的方法。