我正在使用我的TCL代码中的列表(只有一个元素),当我用puts打印出来时,我看到文本有时用大括号括起来。例如:{abc},有时不是。这会导致问题,因为我正在对此特定文本执行regsub,并且大括号会导致我的代码失败。我还观察到,当文本中有特殊符号时,列表用括号括起来。 任何人都可以解释为什么列表括在括号中。
答案 0 :(得分:4)
当Tcl根据各个值创建列表时,它会尝试使用尽可能少的引用。如果它是一个像abc
这样的简单值,则会省略所有引用字符。如果它是一个带有metasyntax字符的值,如空格(abc def
),则将其括在大括号({abc def}
)中。如果它是(abc{def
)中具有不平衡大括号的值,则使用反斜杠(abc\{def
)。这确保了Tcl创建的列表总是可以理解为包含单个命令的脚本,该命令的单词正是列表的元素。
在列表中使用regexp
不是一个好主意;这种格式对于那种工作并不是非常友好(当你把所有可以解析的作为一个列表时,它会更糟糕,这比Tcl实际上要多得多从list
命令生成。提取元素(例如,使用lindex
或foreach
)并将正则表达式应用于该元素。
答案 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}