以下是TCL脚本,使用while循环打印1到10之间的数字。
set b 1
while {$b<11} {
puts $b
incr b
}
在上面的脚本中,如何制作&#34;放置$ b&#34;输出为全球。那么我们可以在脚本中的任何地方使用它吗?
我需要以下内容:
set b 1
while {$b<11} {
set a $b
incr b
}
puts "This is number $a"
如果我在外部循环中使用$a
,它应该将输出打印为:
This is number 1
This is number 2
This is number 3
.
.
.
This is number 10
答案 0 :(得分:3)
Tcl确实严格运作;它在你告诉它的地方做事情。但是,您可以做的一件事是在变量上放置trace
,以便在写入变量时运行某些代码。
# This is Tcl 8.5 syntax; let me know if you want it for 8.4 and before
trace add variable ::a write {apply {args {
puts "This is number $::a"
}}}
我上面使用了完全限定的变量名;跟踪实际上位于命名空间a
中的变量::
。
然后,设置跟踪之后,当我们执行:
set b 1
while {$b<11} {
set a $b
incr b
}
输出是:
This is number 1 This is number 2 This is number 3 This is number 4 This is number 5 This is number 6 This is number 7 This is number 8 This is number 9 This is number 10
这就是你想要的。
答案 1 :(得分:0)
你的问题并不完全清楚:我认为Donal Fellows可能给你正确答案,但我想我可能会在你的文本中看到另一个问题,即:我怎么能写一个通用的命令,因为它是的,拿一个变量进行短暂的旋转?
如:
set b 1
myLoop b {
set a $b
puts "This is number $a"
}
puts "Again, this is number $a"
你会像这样写myLoop
:
proc myLoop {varName body} {
upvar 1 $varName i
for {} {$i < 11} {incr i} {
uplevel 1 $body
}
}
请注意,这不是编写这样的命令的最佳方法:我这样写它是为了适应您的示例代码。
该命令的工作原理是调用uplevel
来评估调用者上下文中body
中的脚本,无论哪个。为了允许myLoop
操作脚本中的变量,我们需要设置一些东西,以便命令与调用者共享变量。 upvar
命令执行此操作。