0

我有一个选择查询(查询返回 4 条记录,每条记录 7 行),它返回如下输出:

{HD 208 {} 2012-04-13 25 21 4} {SD 208 {} 2012-04-13 100 97 3} {HD 2072 {} 2012-04-13 5 4 1} {SD 2072 {} 2012-04-13 50 45 6}

现在我想设置将它们存储在一个变量中并一一显示,以便我可以使用 html 表显示它,记录在 $get_record 中返回。所以这就是我正在做的

foreach record $get_record {
    foreach item [lindex $record 0] {

        set event_name [ lindex $item 0]
        puts $event_name
        set event_date [ lindex $item 1]
        put $event_date
        set attempts_cnt [ lindex $item 2]
        put $attempts_cnt
        set success_cnt [ lindex $item 3]
        put $success_cnt

  }
}

不幸的是,这不起作用..

4

2 回答 2

2

如果您使用的是 Tcl 8.5 或更高版本

foreach record $get_record {
    lassign $record event_name event_date attemts_cnt success_cnt
    puts $event_name
    puts $event_date
    puts $attempts_cnt
    puts $success_cnt
}

如果您有 Tcl 8.4 或更早版本

foreach record $get_record {
    foreach {event_name event_date attemts_cnt success_cnt} $record {break}
    puts $event_name
    puts $event_date
    puts $attempts_cnt
    puts $success_cnt
}
于 2012-04-13T19:52:32.573 回答
2

扩展格伦的答案:

问题是您以错误的方式进行迭代:

  1. 在外部循环中,变量“record”被一一分配到返回的行集中的每一行。
  2. 然后你引入一个未知原因的内部循环,它的工作原理是这样的:
    1. 从包含在“记录”变量中的行中提取第一个元素;
    2. 将该元素解释为列表并对其进行迭代。使用您的数据,该元素将类似于“HD”,它被解释为一个元素的列表(毫不奇怪,“HD”)。

这个错误现在应该很清楚了。

因此 Glenn 提供的修复很简单:

  • 只保留外部循环,它遍历结果集的行。
  • 对于每一行,将该行的“列值”的值分配给一组命名变量。已经为您提供了惯用的方法(或使用+lassign的技巧),但您也可以保留您的+方法(但它更冗长且不那么优雅)。foreachbreaklindexset
于 2012-04-13T21:08:32.040 回答