我已经搜索过lappend $var1 $var2
,但没有找到任何确切的答案,它将如何执行.
% set a {a b c} a b c % set b {d e} d e % puts [lappend $c $b] can't read "c": no such variable >>> here it throws error like variable not exist % puts [lappend $a $b] {d e} >>> here it doesn't throw any error, can someone explain it and how to print the value of $a, if $a is a new variable % puts $$A can't read "A": no such variable % puts $$a $a b c % puts ${$a} can't read "$a": no such variable
Donal Fellow.. 5
Tcl有一个两级语法,它严格适用于所有内容.第一级是Tcl通用语法,它采用:
lappend $var1 $var2
并将其解析为三个单词:lappend
通过读取变量var1
获得的单词,以及通过读取变量获得的单词var2
.
然后Tcl调度到由第一个单词(lappend
,一个内置的Tcl)命名的命令,该命令应用命令语法处理.在这种情况下lappend
,它非常简单:第一个参数命名一个变量,第二个和后续参数是附加到命名变量列表中的单词.
在您的情况下,命名变量的第一个参数是通过读取另一个变量(var1
)获得的,并且要附加到列表的值来自变量(var2
); 一个名字就像a b c d e
是Tcl中的合法变量名,但它的使用真的很尴尬.你不想写的可能性非常高:将变量名放在变量中通常是混淆代码的一个指标.你可以做到,但你几乎不想这样做(除非你使用变量名upvar
).你可能真的打算写:
lappend var1 $var2
Tcl 对变量名和变量内容之间的区别非常精确.该$
不是装饰!它就是说"现在读这个变量",并且$var1
实际上等同[set var1]
于语义术语.($
简写后来,当天回来的Tcl 2.0功能!)
Tcl也不允许双重解除引用$$vrbl
.在极少数情况下,你需要它,你做到了[set $vrbl]
.如果你这样做,你可能应该立即看看你是否可以使用数组,因为这通常是一个更好的选择......
Tcl有一个两级语法,它严格适用于所有内容.第一级是Tcl通用语法,它采用:
lappend $var1 $var2
并将其解析为三个单词:lappend
通过读取变量var1
获得的单词,以及通过读取变量获得的单词var2
.
然后Tcl调度到由第一个单词(lappend
,一个内置的Tcl)命名的命令,该命令应用命令语法处理.在这种情况下lappend
,它非常简单:第一个参数命名一个变量,第二个和后续参数是附加到命名变量列表中的单词.
在您的情况下,命名变量的第一个参数是通过读取另一个变量(var1
)获得的,并且要附加到列表的值来自变量(var2
); 一个名字就像a b c d e
是Tcl中的合法变量名,但它的使用真的很尴尬.你不想写的可能性非常高:将变量名放在变量中通常是混淆代码的一个指标.你可以做到,但你几乎不想这样做(除非你使用变量名upvar
).你可能真的打算写:
lappend var1 $var2
Tcl 对变量名和变量内容之间的区别非常精确.该$
不是装饰!它就是说"现在读这个变量",并且$var1
实际上等同[set var1]
于语义术语.($
简写后来,当天回来的Tcl 2.0功能!)
Tcl也不允许双重解除引用$$vrbl
.在极少数情况下,你需要它,你做到了[set $vrbl]
.如果你这样做,你可能应该立即看看你是否可以使用数组,因为这通常是一个更好的选择......