TCL regsub 到变量?

TCL regsub to variable?

我正在设置宏、Set 和 Say。在程序中定义。

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,这是一个有效变量。 Eval $mouse 输出没有这样的变量

我是不是漏掉了什么?

谢谢

问题出在 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:我还删除了一些反斜杠,因为在那种情况下并不需要它们。