如何将Tcl"列为字符串"列表?

时间:2017-09-03 15:40:47

标签: string list tcl

由于某种未知原因,以下代码行中的变量result

set result [[$sqlCmd execute] allrows -as lists]  

获取类似于列表的字符串:{2 3 4 5}

如果我写puts "result $result => [llength $result]",则会打印{2 3 4 5} => 1

如果我写puts [list $result],它会打印{{2 3 4 5}},这是正确的,因为list会从一个字符串创建列表。
有没有办法将此字符串转换为预期的字符 - 列表 - 没有任何字符串处理步骤,如删除大括号和将字符串拆分为split函数列表?我建议它必须是一些解释,但我无法找到很好的解释。

2 个答案:

答案 0 :(得分:2)

allrows方法总是返回一个列表,每行一个(即使只返回一行)。传入-as lists选项时,该列表的每个元素本身就是一个表示该行中列的列表。

因此,要迭代该行的列,您可以执行以下操作:

set result [[$sqlCmd execute] allrows -as lists]  
set rowresult [lindex $result 0]
foreach col $rowresult {
    puts "I've got a '$col'"
}

通常建议您使用表示行的默认值作为按列名索引的字典,因为它具有更好的SQL NULL表示形式(即,列不存在,而不是驱动程序 - 指定的空值,通常是含糊不清的空字符串)。

答案 1 :(得分:1)

allrows为您提供了一个列表列表,每个子列表代表一行。此列表中有1行2 3 4 5,因此长度为1.您可以通过列表索引或迭代访问其中一个元素的常用方法。

# If you're assuming there will only be one row
set only_row [lindex $result 0]

# Or if you want to iterate over all rows
foreach row $result {
    do whatever with $row
}