TCL中列表的行为

时间:2016-04-27 09:50:16

标签: list tcl

我正在使用我的TCL代码中的列表(只有一个元素),当我用puts打印出来时,我看到文本有时用大括号括起来。例如:{abc},有时不是。这会导致问题,因为我正在对此特定文本执行regsub,并且大括号会导致我的代码失败。我还观察到,当文本中有特殊符号时,列表用括号括起来。 任何人都可以解释为什么列表括在括号中。

2 个答案:

答案 0 :(得分:4)

当Tcl根据各个值创建列表时,它会尝试使用尽可能少的引用。如果它是一个像abc这样的简单值,则会省略所有引用字符。如果它是一个带有metasyntax字符的值,如空格(abc def),则将其括在大括号({abc def})中。如果它是(abc{def)中具有不平衡大括号的值,则使用反斜杠(abc\{def)。这确保了Tcl创建的列表总是可以理解为包含单个命令的脚本,该命令的单词正是列表的元素。

在列表中使用regexp不是一个好主意;这种格式对于那种工作并不是非常友好(当你把所有可以解析的作为一个列表时,它会更糟糕,这比Tcl实际上要多得多从list命令生成。提取元素(例如,使用lindexforeach)并将正则表达式应用于该元素。

答案 1 :(得分:0)

tcl中的值与其他语言的工作方式不同。在tcl中,列表只是一个字符串。特殊格式的字符串。

解释

列表的规则看似简单:

  

列表只是一串单词,其中列表的每个元素都是由空格分隔的单词。

" word"以上是tcl对单词的定义,而不是常规英语定义:

  

空格分隔单词

这意味着单词是由空格分隔的连续字符串。但我们还有另一条规则:

  

单词可以完全用引号括起来以逃避对空格的解释

换句话说,在tcl代码中:

# The following is a word:
hello

# The following is also a word, ONE word, not two:
"hello world"

# The following are TWO words:
say "hello world"

列表示例

因此,根据以上定义单词的规则,以下是列表的示例:

# This is a list of two elements:
"hello world"

# This is a list of one element:
"\"hello world\""

第二个列表是一个元素的原因是因为我们用hello引用了两个单词world"",因此tcl解释器将其视为单个单词。

行情

现在回答I see that the text is sometimes enclosed with braces

在tcl中引用单词/字符串有两种方法:""{}。双引号的工作方式与它们在Perl中的工作方式相同,而大括号的工作方式与Perl中的单引号相同。也就是说,变量和函数在""范围内替换,但不在{}范围内。

所以以下两个列表完全等效:

# List with one element:
{"hello world"}

# List with one element:
{{hello world}}

有趣的是,上面的两个列表也相当于:

# List with one element:
{hello\ world}

因为转义空格字符迫使tcl处理就像普通字符而不是单词分隔符。

从技术上讲,如果您尝试将其视为字符串,那么列表应该是什么样的官方规范形式。因此,如有必要,口译员可以自由插入{}\""。所以不要将列表视为字符串。让tcl处理列表。

例如,要避免regexp需要处理{}个字符,您应该使用list操作来处理所需的元素:

set l {}
lappend l "hello world"
regexp {hello} [lindex $l 0]

如果您需要搜索列表,请使用lsearch代替regexp

lsearch -regexp $l {hello}