我的TCL脚本有问题。 在下面的代码我有一个列表:
set arcs {
{a b $myVar(0)} {b a $myVar(1)} {b c $myVar(2)} {c f $myVar(3)} {b d $myVar(4)}
}
在$ myVar($ i)中存储了一个数值。 我有一个这样的功能:
proc myProc arcs {
foreach arc $arcs {
lassign $arc v1 v2 cost
dict set graph $v1 $v2 $cost
}
return $graph
}
我打电话给函数:
myProc $arcs
但是在函数中,我不能检索存储在$ ab($ i)中的值的数字,只检索存储在$ cost中的变量的名称。比如:
$v1 ----> a
$v2 ----> b
$cost ----> $myVar(0)
请告诉我如何将变量值传递给函数。比如:
$v1 ----> a
$v2 ----> b
$cost ----> 25 /// value of $myVar(0)
我是tcl的新手,我无法解决问题。我非常感谢您的帮助。
答案 0 :(得分:0)
您可以使用[subst $cost]
。请注意,myVar
必须在过程的范围内可见。
详细说明:
proc myProc arcs {
global myVar
foreach arc $arcs {
lassign $arc v1 v2 cost
dict set graph $v1 $v2 [subst $cost]
}
return $graph
}
变量myVar
通过命令global
可见(如果它不是全局的,upvar
可能会这样做)。在字典中插入值时,cost
的值将通过subst
传递,以便从$myVar(index)
执行变量替换。
可以将其简化为:
proc myProc arcs {
global myVar
foreach arc $arcs {
dict set graph {*}[subst $arc]
}
return $graph
}
虽然这段代码不太清楚。
答案 1 :(得分:0)
使用大括号时,不执行替换并使用文字值。 我会更改初始化以使用列表:
set arcs [list \
[list a b $myVar(0)] \
[list b a $myVar(1)] \
[list b c $myVar(2)] \
[list c f $myVar(3)] \
[list b d $myVar(4)] \
]
答案 2 :(得分:0)
问题是双重的。首先,输入列表不具有变量的值,而是具有文字字符串,其次,您需要该值的上下文不是已知该值的上下文。要解决这个问题,我们需要检测何时应用修复(regexp
是我最喜欢的方法),在这种情况下,使用upvar 1
将有问题的变量带入一个名称很好的临时范围中我们可以用它的价值来代替成本。
proc myProc {arcs} {
foreach arc $arcs {
lassign $arc v1 v2 cost
# Detect if we've got something we want to interpret as a variable use
if {[regexp {^\$(.*)$} $cost -> varName]} {
# NOTE: DO NOT USE [upvar 1 $varName cost] BECAUSE WE ARE IN A LOOP!
# IGNORING THAT WILL DESTROY YOUR DATA.
upvar 1 $varName var
set cost $var
}
dict set graph $v1 $v2 $cost
}
return $graph
}