我搜索了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
答案 0 :(得分: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]
。如果你这样做,你可能应该立即看看你是否可以使用数组,因为这通常是一个更好的选择......
答案 1 :(得分:1)
lappend
的第一个参数是变量名,而不是值。因此,一般来说,它应该是:
lappend var1 $var2
其中var1和var2都是列表变量。有关详细信息,请参阅Tcl lappend man page。