% set j 1
1
% set a [list $j]
1
% set a [list {$j}]
{$j}
% set a "$j"
1
% set a "[list {$j}]"
{$j}
""
在这种情况下,和之间的确切区别是[list]
什么?为什么j
最后一种情况下的值没有被替换为以(引号)开头的值?为什么j
价值不被替换% set a [list {$j}]
?我对此感到非常困惑。
% set j 1
1
% set a [list $j]
1
% set a [list {$j}]
{$j}
% set a "$j"
1
% set a "[list {$j}]"
{$j}
""
在这种情况下,和之间的确切区别是[list]
什么?为什么j
最后一种情况下的值没有被替换为以(引号)开头的值?为什么j
价值不被替换% set a [list {$j}]
?我对此感到非常困惑。
您可以阅读这本书的摘录,其中讨论了您在此处提出的问题。
基本上,它讨论了 Tcl 中的分组和不同的替换,我认为这真的会让你理解你在问什么。
在这种情况下,“”和[列表]之间的确切区别是什么?
你的问题很模糊。set a [list {$j}]
如果您要问和之间的确切区别是什么set a "[list {$j}]"
,我会说没有区别。在这两种情况下,变量a
都被设置为您定义的列表。
引号用于将单词组合在一起以形成一个论点。如果您有以下代码,您的代码会有所不同:
set a This list contains: [list {$j}]
和
set a "This list contains: [list {$j}]"
第一行是给变量a
4 个参数,即:This
, list
,但这会给你一个错误,因为contains:
最多只接受两个参数,一个是变量名,另一个是变量的值。[list {$j}]
set
第二行给出a
一个由引号分组的单个变量"This list contains: [list {$j}]"
。引号将允许命令替换,以便list
执行命令并将返回值提供给变量a
。
为什么
j
最后一种情况下的值没有被替换为以(引号)开头的值?为什么j
价值不被替换% set a [list {$j}]
?
最里面的分组是{$j}
和大括号防止发生任何形式的替换。发生的事情是你首先得到"[list {$j}]"
并且 Tcl 评估命令:[list {$j}]
。列表的第一个元素是未替换的字符串$j
,因此list
返回$j
的不是变量的值j
。
要使列表返回变量的值j
,只需删除大括号:
set a "[list $j]"
由于[list $j]
是引号中的唯一内容,因此您可以删除引号以产生相同的结果。
set a [list $j]
请注意,列表的元素通常用大括号括起来:
% puts [list "item 1" "item 2"]
{item 1} {item 2}
请注意,这相当于:
% puts [list {item 1} {item 2}]
{item 1} {item 2}
因为没有要执行的替换。但!
% set a "item 1"
item 1
% set b "item 2"
item 2
% puts [list "$a" "$b"]
{item 1} {item 2}
% puts [list $a $b]
{item 1} {item 2}
% puts [list {$a} {$b}]
{$a} {$b}
% puts [list "$a $b"]
{item 1 item 2}
% puts [list {$a $b}]
{$a $b}
我认为这应该足够简单,以显示替换和分组在 Tcl 中是如何工作的。如果你应用我所解释的,应该很容易理解为什么会发生上述每一个。