当前位置:  开发笔记 > 编程语言 > 正文

如何执行lappend $ varname1 $ varname2

如何解决《如何执行lappend$varname1$varname2》经验,为你挑选了1个好方法。

我已经搜索过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].如果你这样做,你可能应该立即看看你是否可以使用数组,因为这通常是一个更好的选择......



1> Donal Fellow..:

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].如果你这样做,你可能应该立即看看你是否可以使用数组,因为这通常是一个更好的选择......

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有