$varName 上的 lappend 如何工作?
How does lappend on $varName work?
我犯了一个愚蠢的错误,给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
的变量(是否可以有这样的变量名)?
它被附加到名为 e1 e2 e3
的变量,即空格是名称的一部分。命令调用中的参数数量在变量替换期间被保留,因此如果 $l
是单个参数,它扩展到的值仍然是单个参数,就像您编写 {e1 e2 e3}
一样。如果您改为编写 lappend {*}$l e4
,调用将是 lappend e1 e2 e3 e4
(命令名称和四个参数,将值 e2
、e3
和 e4
附加到名为 e1
的变量),假设 Tcl 8.5 或更高版本。
文档:lappend
% set l [list e1 e2 e3]
e1 e2 e3
% lappend $l e4 <<<<< 这意味着,我们正在创建一个新变量“$l”并将其附加到其中。 - 这是我们需要做出改变的地方。
e4
% lappend l e4 <<<< 这就是我们想要的 ---> 这里我们追加到我们的变量 "l"
e1 e2 e3 e4
我犯了一个愚蠢的错误,给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
的变量(是否可以有这样的变量名)?
它被附加到名为 e1 e2 e3
的变量,即空格是名称的一部分。命令调用中的参数数量在变量替换期间被保留,因此如果 $l
是单个参数,它扩展到的值仍然是单个参数,就像您编写 {e1 e2 e3}
一样。如果您改为编写 lappend {*}$l e4
,调用将是 lappend e1 e2 e3 e4
(命令名称和四个参数,将值 e2
、e3
和 e4
附加到名为 e1
的变量),假设 Tcl 8.5 或更高版本。
文档:lappend
% set l [list e1 e2 e3]
e1 e2 e3
% lappend $l e4 <<<<< 这意味着,我们正在创建一个新变量“$l”并将其附加到其中。 - 这是我们需要做出改变的地方。
e4
% lappend l e4 <<<< 这就是我们想要的 ---> 这里我们追加到我们的变量 "l"
e1 e2 e3 e4