我如何在程序之外传递一些变量/数组?
让我说我的程序'myproc'带有输入参数{a b c d e},例如
myproc {a b c d e} {
... do something
(calculate arrays, lists and new variables)
}
在这个过程中,我想从变量a-e中计算一个数组phiN(1),phiN(2),... phiN(18),它本身就是一个列表,例如
set phiN(1) [list 1 2 3 4 5 6 7 8 9];
(假设值1-9是根据输入变量a-e计算出来的)。我想计算一些其他参数alpha和beta
set alpha [expr a+b];
set beta [expr c+d];
无论如何,我不想在程序之外传递这些新的计算变量。与matlab相比,我只想编写sg,以便将这些变量置于'函数'之外。
[phiN,alpha,beta] = myproc{a b c d e}
有谁知道如何处理tcl?谢谢!
答案 0 :(得分:2)
有几种选择:
返回列表并使用外部lassign
例如:
proc myproc {a b c d e} {
set alpha [expr {$a+$b}]
set beta [expr {$c+$d}]
return [list $alpha $beta]
}
lassign [myproc 1 2 3 4 5] alpha beta
如果返回值而不是数组,这很好。
使用upvar
并提供数组/变量的名称作为参数
例如:
proc myproc {phiNVar a b c d e} {
upvar 1 $phiNVar phiN
# Now use phiN as local variable
set phiN(1) [list 1 2 3 4 5 6 7 8 9]
}
# Usage
myproc foo 1 2 3 4 5
foreach i $foo(1) {
puts $i
}
结合使用
例如:
proc myproc {phiNVar a b c d e} {
uplevel 1 $phiNVar phiN
set alpha [expr {$a+$b}]
set beta [expr {$c+$d}]
set phiN(1) [list 1 2 3 4 5 6 7 8 9]
return [list $alpha $beta]
}
lassign [myproc bar 1 2 3 4 5] alpha beta
foreach i $bar(1) {
puts $i
}
编辑:正如Donal所说,也有可能返回一个字典:
dict是一个Tcl列表,其中奇数元素是键,偶数元素是值。您可以使用array get
将数组转换为dict,并将dict转换回array set
的数组。您也可以使用dict本身
实施例
proc myproc {a b c d e} {
set alpha [expr {$a+$b}]
set beta [expr {$c+$d}]
set phiN(1) [list 1 2 3 4 5 6 7 8 9]
return [list [array get phiN] $alpha $beta]
}
lassign [myproc 1 2 3 4 5] phiNDict alpha beta
array set bar $phiNDict
foreach i $bar(1) {
puts $i
}
# Use the [dict] command to manipulate the dict directly
puts [dict get $phiNDict 1]
有关更多提示(这是关于数组,但也可以应用于值),请参阅this wiki entry。