gpt4 book ai didi

TCL 数组索引 - 规范是什么

转载 作者:行者123 更新时间:2023-12-04 02:45:45 25 4
gpt4 key购买 nike

我碰巧遇到了这个:

set a(()) 100

它被TCL 解释器获取并添加到数组a 中,索引为() 且值为100 的元素。

我很困惑。 official TCL spec数组索引就不多说了,可以取任意字符。那也行。问题是,如何取回?

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

can't read "a(()": no such element in array

解决方法是:

set i ()
puts $a($i)

puts [set a(())]

我正在打败自己,弄清楚为什么 $a(()) 在 "a(())"被愉快地使用时不起作用,但不能找到任何。

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

最佳答案

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

set a(()) 100
set a(())

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

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

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

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

如果 $ 之后的第一个字符是左大括号,则匹配的右大括号之前的所有字符都用作变量名,这意味着括号内不能有匹配的右大括号,但除此之外几乎任何事情都会发生。这意味着 ${a(())} 也可以工作。

文档:set , Tcl

关于TCL 数组索引 - 规范是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com