在TCL中,带括号和大括号的双美元意味着什么? 问题:

在TCL中,带括号和大括号的双美元意味着什么? 问题:,tcl,Tcl,下面这行是做什么的 eval "set abc \$${SID}(abc)" 我的尝试 我知道$someArray(index)是在TCL中访问数组的方式。 所以 希望abc是数组SID的一个键(据我所知abc可以是任何东西,因为TCL中的所有数组都是关联的。这正确吗?)。然后它将该值分配给abc 所以在伪代码中,这行代码 Ensure: SID is array, abc exists abc <- SID[abc] 确保:SID是数组,abc存在 abc大括号用于防止替换字符过多

下面这行是做什么的

eval "set abc \$${SID}(abc)"
我的尝试 我知道
$someArray(index)
是在TCL中访问数组的方式。 所以

希望
abc
是数组
SID
的一个键(据我所知
abc
可以是任何东西,因为TCL中的所有数组都是关联的。这正确吗?)。然后它将该值分配给
abc

所以在伪代码中,这行代码

Ensure: SID is array, abc exists

abc <- SID[abc]
确保:SID是数组,abc存在

abc大括号用于防止替换字符过多的变量

$variableonetwo
引用名为
variableonetwo
的变量并返回其值:

% set variableonetwo 1
% puts $variableonetwo
1
但是

${variableone}two
指名为
variableone
的变量和字符串
two

% set variableone 1
% puts ${variableone}two
1two
% puts $variableonetwo
can't read "variableonetwo": no such variable

eval
用于。。。很好地评估/执行一个命令

eval "set abc \$${SID}(abc)"
如果
$SID
的值为数组
foo
,则将尝试计算以下值

set abc $foo(abc)

这里使用
eval
的一个优点是,您可以在同一行中有两个替换,而不是一个,第一个替换是将
$SID
替换为数组名,第二个替换是从数组值(从提供的键)替换而来。

这些不是大括号(
{}
),而是圆括号,在这种情况下,它们似乎是变量名称的一部分。@Hoodiecrow:根据,
{}
被称为“大括号”或“花括号”。但我的问题也有错误。谢谢你指出这一点。哦,糟糕透了。我应该在发布我的答案之前刷新。。。Oops@Jerry:我真的很抱歉!一旦我意识到我犯了这个错误,我就改正了。@moose:是的,我就是这么说的<代码>{}
是大括号,
()
是圆括号。我在代码行中出错了。它是
eval“设置abc\${SID}(abc)”
而不是
eval“设置abc\$$(SID)(abc)”
。抱歉。@moose从好的方面来说,我的答案中确实包含了
\$${SID}(abc)
,哈哈。好吧,那么我理解它是否正确,它与我在问题中用伪代码写的一样?@moose我编辑了我的答案,使它更接近主题。我不会说它确保了
SID
是数组,并且
abc
存在,因为如果其中任何一个都不存在,代码段就会失败。我能想到的不存在这两种情况的一种保护措施是使用
catch
catch{eval“set abc\$${SID}(abc)”}
。唯一需要注意的是:双重eval通常是个坏主意。最好使用
upvar 0
创建本地别名并通过该别名进行分配。
set abc $foo(abc)