TCL数组索引 - 规范是什么

my_*_*ion 3 tcl

我碰巧碰到了这个:

set a(()) 100
Run Code Online (Sandbox Code Playgroud)

它由TCL解释器获取,并向数组添加a索引为()且值为100的元素.

我很困惑.该官员TCL规范并没有说太多关于数组的索引,它可以采取任何字符.那样就好.问题是,如何检索它?

puts $a(()) 不起作用:

can't read "a(()": no such element in array
Run Code Online (Sandbox Code Playgroud)

解决方法是:

set i ()
puts $a($i)
Run Code Online (Sandbox Code Playgroud)

要么

puts [set a(())]
Run Code Online (Sandbox Code Playgroud)

我打败自己是为了理解为什么$a(())当" a(())"被愉快地采取时却不起作用,但找不到任何东西.

你能救吗?或者这是我们刚认识并与之共存的东西?

Pet*_*rin 5

a(())是数组成员的有效名称,正如您所说,我们可以使用以下命令为其分配并检索其值set:

set a(()) 100
set a(())
Run Code Online (Sandbox Code Playgroud)

在调用set命令时,就像所有命令一样,解释器首先将命令行拆分为单词,根据需要执行替换,然后将这些单词作为参数传递给命令.第一个参数set是变量名:set命令使用与名称关联的变量或在分配时创建新变量,如果在检索时找不到任何此类变量,则会引发错误.

$语法主要是单参数的语法糖set,但不一定只使用一个命令行字来表示变量名.当解释器发现未转义时,$它会尝试查找构成变量名的字符序列,然后将变量的值替换为$名称.在此之后,该单词可以包含更多文本,并且该单词不必以a开头$.

解释器小心不要超匹配,因此只允许一组有限的字符,一旦发现非法字符,它就会停止并尝试使用它找到的替换.如果找到左括号,则稍微放宽匹配(因为它可以期望以右括号的形式找到结束标记),以便可以在索引内执行不同类型的替换(这就是为什么set i () ; puts $a($i)有效).

在这种情况下,如果单词结束,则匹配停止(即找到空格;由于格式错误的变量名称,替换将失败)或找到右括号.这就是$a(())失败的原因:解释器尝试a(()用作变量名,后跟a )作为单词中的下一个字符.$a((\)) 确实有效,因为逃避第一个右括号会否定其句法意义.

如果后面的第一个字符$是左括号,则匹配右括号的所有字符都将用作变量名,这意味着括号内不能有匹配的闭括号,但几乎任何东西都可以.这意味着它${a(())}也有效.

文档:set,Tcl