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

如何解释${variableName}中的tcl花括号?,tcl,Tcl,我是TCL编程的新手。我对花括号感到困惑,对这个问题的回答消除了我大部分的疑虑。 我能理解$var,{var}和{$var},但最近我遇到了另一个大括号的用法,${var}。TCL对此有何解释? 我已经看到,当名称空间名称位于变量中时,在访问名称空间中的变量时会使用这种方法 例如: set x myNamespace ;#myNamespace is name of namespace puts [set ${x}::var1] ;#var1 is variable in the name

我是TCL编程的新手。我对花括号感到困惑,对这个问题的回答消除了我大部分的疑虑。 我能理解
$var
{var}
{$var}
,但最近我遇到了另一个大括号的用法,
${var}
。TCL对此有何解释? 我已经看到,当名称空间名称位于变量中时,在访问名称空间中的变量时会使用这种方法

例如:

set x myNamespace   ;#myNamespace is name of namespace 
puts [set ${x}::var1] ;#var1 is variable in the namespace
如果不在“x”周围使用大括号,则会出现错误

我也不明白
{abc}
[列表abc]
之间的区别,TCL解释这两个命令的结果有什么区别

如能详细解释,将不胜感激

见第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
将尝试取消对
x
命名空间中
var1
变量的引用。因为这不是您的意思,所以必须分别取消引用
x
变量。有两种方法可以做到这一点。您可以使用
set
命令或美元运算符

set x myNamespace
puts [set ${x}::var1]
puts [set [set x]::var1]
这两个puts语句在这里是等效的,第二个版本显示了一个明确的单独过程,以获取
x
变量的值,然后将该值替换为外部
set
命令的表达式。在第一个版本中也会出现同样的情况,但只使用分组运算符将美元的作用限制在变量名上。

请参见的规则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
将尝试取消对
x
命名空间中
var1
变量的引用。因为这不是您的意思,所以必须分别取消引用
x
变量。有两种方法可以做到这一点。您可以使用
set
命令或美元运算符

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

这两个puts语句在这里是等效的,第二个版本显示了一个明确的单独过程,以获取
x
变量的值,然后将该值替换为外部
set
命令的表达式。在第一个版本中也会出现同样的情况,但只使用分组运算符将美元的效果限制为
x
变量名。

。这个问题的措辞不同,但主要的根本问题是。此外,我还解释了底部的大括号。。这个问题的措辞不同,但主要的根本问题是。此外,我还解释了底部的大括号。但为什么在我在问题中提到的代码中没有大括号就不能工作呢?名称空间名称中没有点。谢谢如果删除大括号,则实际上是在执行
[set${x::var1}]
。在某种程度上,它与点问题相反,因为tcl将
::
识别为变量名字符,因此将整个
x::var1
解释为单个变量名。但是,为什么在我在问题中提到的代码中没有大括号它就不能工作呢?名称空间名称中没有点。谢谢如果删除大括号,则实际上是在执行
[set${x::var1}]
。在某种程度上,它与点问题相反,因为tcl将
::
识别为变量名字符,因此将整个
x::var1
解释为单个变量名。