【问题标题】:Alter variables between embedded tcl-scripts在嵌入式 tcl 脚本之间更改变量
【发布时间】:2014-03-14 16:15:15
【问题描述】:

我有两个必须来回传递变量的嵌入式 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" 只会在secondary.tcl 中更改var1。但我不知道该怎么做。

【问题讨论】:

    标签: variables tcl argument-passing


    【解决方案1】:

    只要您将source 脚本放入同一个解释器上下文中,它们就会默认共享变量。 (确实,如果您不想要共享,则需要采取额外的步骤,例如使用命名空间或单独的解释器。)因此,您需要做的就是确定预期会进入哪些变量,以及输出什么变量。

    在您的情况下,您有条件地将 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"
    }
    

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

    【讨论】:

    • 感谢 Donal,这似乎完全符合我的要求。然而,由于要设置大约 25 个不同的变量,它开始使secondary.tcl 变得混乱。是否有任何可能的方法可以提供更简洁的代码,这样我就不必为每个变量使用 5 行?无论如何,这确实有效,谢谢。
    • @user25946 通常的方法是定义一个proc 来完成所有的次要工作。因此,您可以随时获取它(您只需 source 一次,例如在开始时)并使用正确的参数调用它。 (使用source 作为proc 替换是可能的,但我不推荐)
    • 我尝试使用proc,但由于某种原因,我无法调用proc,除非它在我调用它之前出现在代码中。但是我知道应该可以将proc 放在代码的末尾,并且仍然可以从代码中的任何位置调用它。你能告诉我如何做到这一点吗?我必须以某种方式链接到它吗?
    【解决方案2】:

    不确定,从未真正尝试过。我认为您需要将变量保存到文件中并在另一个脚本中读回它们。如果您将它们保存为 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"} {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多