如何解释$ {variableName}中的tcl花括号?

时间:2014-03-12 12:07:28

标签: tcl

我是TCL编程的新手。我对花括号感到困惑,回答这个问题tcl curly braces清除了我的大部分疑虑。 我可以理解$var{var}{$var},但最近我又遇到了花括号${var}的另一种用法。这是如何被TCL解释的? 我已经看到,当命名空间名称在变量中时,在访问命名空间中的变量时会使用它。

例如:

set x myNamespace   ;#myNamespace is name of namespace 
puts [set ${x}::var1] ;#var1 is variable in the namespace

当您不使用花括号时,它会出错。' x'。

我也不理解{a b c}[list a b c]之间的区别,TCL解释对这两个命令的解释结果有何不同。

详细解释将受到高度赞赏。

1 个答案:

答案 0 :(得分:4)

参见the manual的规则8。它允许您拥有可能被错误解释的变量名称。例如:

% set dotted.name 1
1
% puts $dotted.name
can't read "dotted": no such variable
% puts ${dotted.name}
1

仔细阅读第8节,因为它实际上非常清楚地解释了这一切。

更新以回答已修改的问题

在您提供的变量中使用命名空间名称的示例中,您必须考虑第8部分第1部分:变量名称包括字母,数字,下划线和命名空间分隔符。这意味着x::var1是有效的变量名称。因此$x::var1将尝试取消引用var1命名空间中的x变量。由于这不是您的意思,您必须单独取消引用x变量。有两种方法可以做到这一点。您可以使用set命令或美元运算符。

set x myNamespace
puts [set ${x}::var1]
puts [set [set x]::var1]

这两个puts语句在这里是等价的,第二个版本显示了一个显式的单独传递,以获取x变量的值,然后将其替换为外部set命令的表达式。第一个版本也是如此,但只使用分组运算符来限制美元对x变量名称的影响。

相关问题