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