我正在设置宏,设置并说。在过程中定义。
proc Set {key value args} {
set ::$key $value
set "::key2" "$key"
}
proc Say {key} {
puts $key
}
proc Say2 {key} {
set key3 [regsub "\%" $key "\$"]
puts $key3
eval puts $key3
}
这允许我执行以下操作:
Set "test" "this should display this test text"
Say $key2 ;#should display the key "test" which is what we just set
Say $test ;#presents the value of the key test
输出
% Set "test" "this should display this test text"
test
% Say $key2 ;#should display the key "test" which is what we just set
test
% Say $test ;#presents the value of the key test
this should display this test text
现在让我们说我想将变量$重新分配给%
Set "mouse" "squeak" ;#set key mouse with value string of "squeak"
Say $mouse ;#displays the value as set above correctly
Say2 %mouse ;#start using our own characters to represent variables - switch the % for a $ and then output
但是当我使用eval时,会得到
can't read "mouse": no such variable
输出
% Set "mouse" "squeak" ;#set key mouse with value string of "squeak"
mouse
% Say $mouse ;#displays the value as set above correctly
squeak
% Say2 %mouse ;#start using our own characters to represent variables
$mouse
can't read "mouse": no such variable
我发现这很奇怪,因为我们在上面进行了设置,我们可以使用标准$来调用该值,并且可以证明Say2中的regsub可以正常工作,因为它应该将%替换为$。
%mouse变为$ mouse,这是有效变量。 评估没有这些变量的$ mouse输出
我想念什么吗?
谢谢
答案 0 :(得分:2)
问题出在proc
:
proc Say2 {key} {
set key3 [regsub {%} $key {$}]
puts $key3
eval puts $key3 ;# here
}
$mouse
在此proc
中不存在。它没有作为参数传递,也没有用set
创建。但是,它存在于全局名称空间中。实现此目标的一种方法是在这种情况下使用uplevel
:
proc Say2 {key} {
set key3 [regsub {%} $key {$}]
puts $key3
uplevel puts $key3
}
我经常使用的另一个选择是upvar
将变量带入内部(尽管在这种情况下,我们不再需要$
了)
proc Say2 {key} {
set key3 [regsub {%} $key {}]
puts $key3
upvar $key3 var
puts $var
}
PS:我还继续删除了一些反斜杠,因为在这种情况下并不需要它们。