错误:无法读取“n”:tcl中没有此类变量

时间:2013-02-08 05:24:58

标签: variables tcl upvar

proc rep {name} {
    upvar $name n 
    puts "nm is $n"
}

在上述过程中,“name”是一个传递给名为“rep”的过程的参数。当我运行这个程序时,我得到了“error : Can't read "n" : no such variable”。任何人都可以告诉我这个错误的可能原因是什么。

2 个答案:

答案 0 :(得分:5)

如果调用范围中不存在您传递给rep的名称的变量,则会生成该错误消息。例如,使用tclsh ...

检查此交互式会话
% proc rep {name} {
    upvar $name n 
    puts "nm is $n"
}
% rep foo
can't read "n": no such variable
% set foo x
x
% rep foo
nm is x

更深入......

变量fooupvar之后处于一个有趣的状态,如果它未被设置;它实际存在(它在全局命名空间的变量哈希表中引用)但没有内容,因此测试它是否存在失败。 (当一个变量在某个地方有一个条目时就会存在 - 也就是说,一些存储器用于放置其内容 - 并且它在该存储器中设置了一个值;一个未设置的变量可以是一个具有NULL的变量。存储中的C级。由于这个原因,Tcl语言本身根本不支持NULL值;它们对应于不存在。)

答案 1 :(得分:1)

我也碰到了这个。我意识到我发送$ foo而不是foo(注意,没有美元符号)。

% set foo 1
%
% rep $foo
can't read "foo": no such variable
%
% rep foo
nm is 1

希望它有所帮助。