通过将记录存储在变量中逐个显示记录

时间:2012-04-13 19:38:17

标签: tcl

我有一个select查询(查询返回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

  }
}

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

扩展格伦的回答:

问题在于你以错误的方式进行迭代:

  1. 在外部循环中,变量“record”将逐个分配给返回行集的每一行。
  2. 然后你引入了一个内部循环,原因不明,其工作原理如下:
    1. 从“record”变量中包含的行中提取第一个元素;
    2. 将该元素解释为列表并对其进行迭代。使用您的数据,该元素将类似于“HD”,它被解释为一个元素的列表(“HD”,毫不奇怪)。
  3. 现在可能很清楚错误。

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

    • 仅保留外部循环,该循环遍历结果集的行。
    • 对于每一行,将该行的“列值”的值分配给一组命名变量。您已经获得惯用的方法(lassignforeach + break的技巧),但您也可以保留lindex + set方法(但它更冗长,更不优雅)。