% 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}]
值未被替换?我真的很困惑。
答案 0 :(得分:1)
你可以阅读这篇book extract,其中谈到了你在这里提出的问题。
基本上,它讨论了分组和Tcl中的不同替换,我认为这真的会让你理解你所要求的内容。
在这种情况下,“”和[list]之间的确切区别是什么?
你的问题很模糊。如果你问的是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
并将返回值赋给变量{ {1}}。
为什么最后一个案例中的
a
值没有被替换,因为它以(引号)开头?为什么在j
案例中j
值未被替换?
最里面的分组是% set a [list {$j}]
,并且大括号可以阻止任何形式的替换。会发生什么是您首先获得{$j}
并且Tcl评估命令:"[list {$j}]"
。列表的第一个元素是未取代的字符串[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}
我认为这应该足够简单,以显示替换和分组如何在Tcl中工作。如果您应用我所解释的内容,应该很容易理解上述每种情况发生的原因。