List TCL中列表的行为

List TCL中列表的行为,list,tcl,List,Tcl,我正在处理TCL代码中的一个列表(只有一个元素),当我用puts打印出来时,我看到文本有时用大括号括起来。例:{abc}有时不是。这会导致问题,因为我正在对这个特定文本执行regsub,而大括号会导致代码失败。我还注意到,当文本中有特殊符号时,列表用大括号括起来。 谁能解释一下为什么列表用大括号括起来。tcl中的值与其他语言中的值的工作方式不同。在tcl中,列表只是一个字符串。特殊格式的字符串 列表 列表的规则看似简单: 列表只是一串单词,其中列表中的每个元素都是一个由空格分隔的单词 话 上面的

我正在处理TCL代码中的一个列表(只有一个元素),当我用puts打印出来时,我看到文本有时用大括号括起来。例:{abc}有时不是。这会导致问题,因为我正在对这个特定文本执行regsub,而大括号会导致代码失败。我还注意到,当文本中有特殊符号时,列表用大括号括起来。
谁能解释一下为什么列表用大括号括起来。

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解释器将其视为一个单词

引用 现在是
的答案,我看到文本有时用大括号括起来

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

因此,以下两个列表完全等效:

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

# List with one element:
{{hello world}}
有趣的是,上述两个列表也相当于:

# List with one element:
{hello\ world}
因为转义空格字符迫使tcl将其视为普通字符,而不是单词分隔符

从技术上讲,如果您试图将列表视为一个字符串,那么列表应该是什么样子,并没有正式的规范形式。因此,如有必要,解释器可以自由插入
{}
\
”“
。因此,不要将列表视为字符串。让tcl处理列表

例如,为了避免regexp需要处理
{}
字符,应该使用列表操作来处理所需的元素:

set l {}
lappend l "hello world"
regexp {hello} [lindex $l 0]
如果需要搜索列表,请使用
lsearch
而不是
regexp

lsearch -regexp $l {hello}

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解释器将其视为一个单词

引用 现在是
的答案,我看到文本有时用大括号括起来

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

因此,以下两个列表完全等效:

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

# List with one element:
{{hello world}}
有趣的是,上述两个列表也相当于:

# List with one element:
{hello\ world}
因为转义空格字符迫使tcl将其视为普通字符,而不是单词分隔符

从技术上讲,如果您试图将列表视为一个字符串,那么列表应该是什么样子,并没有正式的规范形式。因此,如有必要,解释器可以自由插入
{}
\
”“
。因此,不要将列表视为字符串。让tcl处理列表

例如,为了避免regexp需要处理
{}
字符,应该使用列表操作来处理所需的元素:

set l {}
lappend l "hello world"
regexp {hello} [lindex $l 0]
如果需要搜索列表,请使用
lsearch
而不是
regexp

lsearch -regexp $l {hello}

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


< >在列表中使用<代码> ReXEP <代码>不是一个好主意;这种格式对这类工作并不是非常友好(当考虑所有可以被解析为列表的所有内容时,它会更糟糕,这比TCL列表命令中实际生成的内容要多得多)。(例如,使用
lindex
foreach
)并对其应用正则表达式。

当Tcl从单个值创建列表时,它尝试使用尽可能少的引用。如果它是一个像
abc
这样的简单值,它会忽略所有引用字符