-1
% 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}]?我对此感到非常困惑。

4

1 回答 1

1

您可以阅读这本书的摘录,其中讨论了您在此处提出的问题。

基本上,它讨论了 Tcl 中的分组和不同的替换,我认为这真的会让你理解你在问什么。

在这种情况下,“”和[列表]之间的确切区别是什么?

你的问题很模糊。set a [list {$j}]如果您要问和之间的确切区别是什么set a "[list {$j}]",我会说没有区别。在这两种情况下,变量a都被设置为您定义的列表。

引号用于将单词组合在一起以形成一个论点。如果您有以下代码,您的代码会有所不同:

set a This list contains: [list {$j}]

set a "This list contains: [list {$j}]"

第一行是给变量a4 个参数,即: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 中是如何工作的。如果你应用我所解释的,应该很容易理解为什么会发生上述每一个。

于 2013-08-30T18:36:57.523 回答