如何查找我在Tcl的列表中是否有列表

时间:2017-07-10 17:00:22

标签: tcl

我想读取tcl中的列表,然后输出每个索引处的元素以及索引。

例如:mylist = 1 2 {34 45 {567 678}}

我的输出应该是 0处的元素是1 1处的元素是2 2 0处的元素是34 2 1处的元素是45 2 2 0处的元素是567 2 2 1处的元素是678

1 个答案:

答案 0 :(得分:0)

一般情况下,你没有,因为你不能一般告诉row row row your boat是一个字符串还是五个元素的列表。 (Tcl确实有一些内部类型信息,但它没有你希望的那么有用。)但是如果你知道嵌套列表结构的叶子都是数字(或其他任何一个简单的单词),你< em>可以做到。

proc printGuessListStructure {theList {indices {}}} {
    if {$theList eq [lindex $theList 0]} {
        puts "element $theList is at $indices"
        return
    }
    set idx -1
    foreach value $theList {
        printGuessListStructure $value [concat $indices [incr idx]]
    }
}

测试出来:

set mylist {1 2 {34 45 {567 678}}}
printGuessListStructure $mylist

打印出来:

element 1 is at 0
element 2 is at 1
element 34 is at 2 0
element 45 is at 2 1
element 567 is at 2 2 0
element 678 is at 2 2 1

关键是测试$theList eq [lindex $theList 0]适用于简单的单词,并允许我们避免从叶子看起来像单元素列表的情况下永远递归。

另外,查看Tcl的内部类型无益的原因是值没有固定类型,而且Tcl在内部对于持续合并非常积极。当你看到它时,你认为是列表的东西可能是暂时的东西。专注于你没有类型的意思可以更好地避免混淆!

相关问题