在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)