在我的tcl脚本中,有一部分代码重复了很多,所以我想用它来制作一个程序。
事情是这部分使用了几十个变量,我想避免作为参数传递给过程。有没有办法让程序看到所有变量? (实际上我希望" main"分支到程序,如" goto"然后返回并继续在main中。)
编辑:它不需要是一个程序,随意建议其他方法来做到这一点。重要的部分是不需要声明从main传递给函数/过程的所有变量/参数。
示例:
proc dummy_proc {} {
set var1 $var2
set var2 $var3
}
set var2 2
set var3 3
dummy_proc
puts "$var1 $var2"
# should print "2 3"
答案 0 :(得分:2)
这是可能的,但通常是不可取的,因为它可以使代码更难阅读(没有直接指示变量来自何处或变量值如何突然改变)。但是在某些情况下,这可以减少重复代码。
使用upvar
(https://www.tcl.tk/man/tcl8.6/TclCmd/upvar.htm):
proc dummy_proc {} {
upvar var1 v1
upvar var2 v2
upvar var3 v3
set v1 $v2
set v2 $v3
}
upvar
所做的是在本地范围内创建一个引用调用者范围内另一个变量的变量。
或者您也可以尝试使用uplevel
(https://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm):
proc dummy_proc {} {
uplevel {
set var1 $var2
set var2 $var3
}
}
uplevel
的作用类似于upvar
,但它不是创建变量引用,而是实际执行调用者范围内的代码。这就像你暂时回到调用函数而不返回,执行一些代码然后回来。因为您在调用者范围内执行代码,所以调用者范围中可见的所有变量都会在您提升的代码中可见。 Uplevel的行为几乎就像一个宏而不是一个函数。
答案 1 :(得分:0)
使用global
proc dummy_proc {} {
global var2 var3
set var1 $var2
set var2 $var3
}
set var2 2
set var3 3
dummy_proc
puts "$var1 $var2"
如果你想要传递很多全局变量,你可以使用一些foreach
,但是你必须有办法找到它们。
例如所有全局变量都称为GLOBAL_<SOMEARG>
proc dummy_proc {} {
foreach glb [info globals GLOBAL_*] {
global $glb
}
...
}