我犯了一个愚蠢的错误并给了lappend
一个$
前缀变量名。以下是:
> set l [list e1 e2 e3]
e1 e2 e3
> puts $l
e1 e2 e3
> lappend $l e4
e4
我知道这是错误的用法,它不能像我预期的那样工作......但令我惊讶的是它以某种方式起作用。即口译员不保释。它似乎是有效的TCL,但我无法弄清楚它究竟做了什么。
我认为它可能会展开$l
并执行lappend e1 e2 e3 e4
,但没有e1
变量。
e4
附加到哪里?一个名为$l
的变量(是否可以使用这样的变量名)?
答案 0 :(得分:4)
它被附加到名为e1 e2 e3
的变量,即空白是名称的一部分。在变量替换期间保留命令调用中的参数数量,因此如果$l
是单个参数,则它扩展为的值仍然是单个参数,就像您编写了{e1 e2 e3}
一样。如果您改为编写lappend {*}$l e4
,则调用将为lappend e1 e2 e3 e4
(命令名称和四个参数,将值e2
,e3
和e4
附加到变量名为e1
),假设为Tcl 8.5或更高版本。
文档:lappend
答案 1 :(得分:0)
%set l [list e1 e2 e3]
e1 e2 e3
%lappend $ l e4<<<<<这意味着,我们正在创建一个新的变量“$ l”并附加到它。 - 这是我们需要做出改变的地方。
E4
%lappend l e4<<<<这就是我们想要的--->这里我们将附加到变量“l”
e1 e2 e3 e4