如何使用TCL从proc返回值

时间:2015-10-30 06:53:41

标签: arrays list return tcl proc

我有一个示例proc

record_id   machine_id  date_start  date_end

1           EQPT-1      10-27-2015
2           EQPT-1      10-28-2015      
3           EQPT-2      10-28-2015
4           EQPT-3      10-28-2015
5           EQPT-3      10-30-2015
6           EQPT-2      10-30-2015


UPDATE machine_log 
SET prev.date_end = new.date_start
WHERE new.machine_id = prev.machine_id
AND new.record_id != prev.record_id

在上面的proc执行之后,我将在单个列表中获得所有b c d值,所以如果我只需要来自上面的proc的b值,那么现在正在做[lindex [exam] 1]。  我正在寻找其他方式以不同的方式获得输出而不是使用lindex或returun_value(b)可以给出我的预期输出

2 个答案:

答案 0 :(得分:3)

您可以使用dict并选择此类键值映射,以明确您的意图:

return [dict create width 10 height 200 depth 8]

我认为Tcl中没有办法返回除复合数据结构之外的多个值或yield中的coroutine

答案 1 :(得分:3)

返回多个值的常用方法是列表。这可以在呼叫站点与lassign一起使用,以便列表立即分成多个变量。

proc exam {args} {
    set input "This is my world" 
    regexp {(This) (is) (my) (world)} $input all a b c d 
    set x "$a $b $c $d" 
    return $x
}

lassign [exam ...] p d q bach

您还可以返回字典。在这种情况下,dict with是一种方便的解包方式:

proc exam {args} {
    set input "This is my world" 
    regexp {(This) (is) (my) (world)} $input all a b c d 
    return [dict create a $a b $b c $c d $d]
}

set result [exam ...]
dict with result {}
# Now just use $a, $b, $c and $d

最后,您还可以在upvar内使用exam将调用者的变量放入范围,尽管通常最明智的做法是只使用调用者为您提供名称的变量。

proc exam {return_var} {
    upvar 1 $return_var var
    set input "This is my world" 
    regexp {(This) (is) (my) (world)} $input all a b c d 
    set var "$a $b $c $d" 
    return
}

exam myResults
puts "the third element is now [lindex $myResults 2]"