$ varName上的lappend如何工作?

时间:2016-01-11 16:55:17

标签: tcl

我犯了一个愚蠢的错误并给了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的变量(是否可以使用这样的变量名)?

2 个答案:

答案 0 :(得分:4)

它被附加到名为e1 e2 e3的变量,即空白是名称的一部分。在变量替换期间保留命令调用中的参数数量,因此如果$l是单个参数,则它扩展为的值仍然是单个参数,就像您编写了{e1 e2 e3}一样。如果您改为编写lappend {*}$l e4,则调用将为lappend e1 e2 e3 e4(命令名称和四个参数,将值e2e3e4附加到变量名为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