我有两个嵌入式Tcl脚本(main.tcl
,secondary.tcl
),它们必须来回传递变量。在运行main.tcl
之前secondary.tcl
的结果必须更改secondary.tcl
中的某些预定义变量。然后secondary.tcl
必须将一些变量传递给main.tcl
以定义如何继续。
示例:
#main.tcl
# Here there is first some script which give some results
# Let's say for now result==0 or 1 and some variable "res"
if { result==0 } {
set var1 $res
} else {
set var2 $res
}
# Depending on which of the variables is set, the corresponding
# variable should be altered in secondary.tcl
source /path/to/secondary.tcl
# Now the result in secondary.tcl has to be inserted in this tcl-script
set res_sec $result_secondary
# Rest of script is executed
辅助tcl脚本看起来像这样
#secondary.tcl
set var1 some_value1
set var2 some_value2
# Rest of script is executed
set result_secondary some_result ;# This variable has to be passed to main.tcl
# End of script
我希望我很清楚自己要做什么。我知道在某些tcl脚本中,他们使用“参数”,然后使用:secondary.tcl -parameters "var1 $res"
只会更改var1
中的secondary.tcl
。但我无法知道如何做到这一点。
答案 0 :(得分:0)
不确定,从未尝试过这个。我认为您需要将变量保存到文件中并在其他脚本中将其读回。如果将它们保存为Tcl代码(set foo bar
等),则只需source
另一个脚本中的文件,它们就会自动成为该脚本中的实时变量。
# script0.tcl:
set foo bar
...
set f [open script1.tcl w]
puts $f "set foo $foo"
close $f
# script1.tcl:
set foo bar
# script2.tcl:
source script1.tcl
if {$foo eq "bar"} {
...
}
答案 1 :(得分:0)
只要您将脚本source
放入相同的解释器上下文中,它们就会默认共享变量。 (事实上,如果你不想想要分享,你需要采取额外的步骤,例如使用名称空间或单独的解释器。)因此,你需要做的就是决定预期会发生什么变量in,以及变出的变量。
在您的情况下,您有条件地将var1
或var2
设置为secondary.tcl
,并始终将result_secondary
设置为main.tcl
。走出去很容易 - 你已经有了这个部分! - 但是你的secondary.tcl
需要稍加调整。它需要的是一种检测变量是否已设置的方法(如果它们不是,您可以根据需要调整行为,可能使用默认值或其他)。这很简单:
if {[info exists var1]} {
puts "var1 was set to $var1"
} else {
set var1 "default var1 value"
}
如果脚本位于不同的解释器中,事情变得更加复杂,因为您必须通过隔离执行。 (当你处理多个进程,甚至是多台计算机时,这一点更为重要。)但我认为最简单的事情就是你在这里需要的东西;如果我错了,请将您的问题编辑为更清楚(或询问另一个问题)。