改变嵌入式tcl脚本之间的变量

时间:2014-03-14 16:15:16

标签: variables tcl argument-passing

我有两个嵌入式Tcl脚本(main.tclsecondary.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。但我无法知道如何做到这一点。

2 个答案:

答案 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,以及变出的变量。

在您的情况下,您有条件地将var1var2设置为secondary.tcl,并始终将result_secondary设置为main.tcl 。走出去很容易 - 你已经有了这个部分! - 但是你的secondary.tcl需要稍加调整。它需要的是一种检测变量是否已设置的方法(如果它们不是,您可以根据需要调整行为,可能使用默认值或其他)。这很简单:

if {[info exists var1]} {
    puts "var1 was set to $var1"
} else {
    set var1 "default var1 value"
}

如果脚本位于不同的解释器中,事情变得更加复杂,因为您必须通过隔离执行。 (当你处理多个进程,甚至是多台计算机时,这一点更为重要。)但我认为最简单的事情就是你在这里需要的东西;如果我错了,请将您的问题编辑为更清楚(或询问另一个问题)。