[英]how to make a variable global inside a while loop
以下是使用while循環打印1到10之間的數字的TCL腳本。
set b 1
while {$b<11} {
puts $b
incr b
}
在上面的腳本中,如何將“puts $ b”輸出作為全局輸出。 那么我們可以在腳本中的任何地方使用它嗎?
我需要以下內容:
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
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
在namespace ::
的變量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
這是你想要的。
你的問題並不完全清楚:我認為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
命令就是這樣做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.