如何执行lappend $ varname1 $ varname2

时间:2015-12-17 15:50:01

标签: tcl

我搜索了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

2 个答案:

答案 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