如何在多行中列出值而不在每行末尾加反斜杠?
如果不能在末尾加上反斜杠,则无法在多行中创建列表。
例如,以下(错误)代码:
set pets [list
cat
dog
elephant
]
给出一个错误:
invalid command name "cat"
while executing
"cat"
invoked from within
"set pets [list
cat
dog
elephant
]"
可以通过在行尾添加反斜杠来解决此问题:
set pets [list \
cat \
dog \
elephant \
]
这很丑陋并且容易出错。
请注意:
{
和}
),但是它不允许执行命令,并且还保留多余的空白字符。 dict create
),不仅像我的示例中的list
。 使用Tcl 8.5
最佳答案
Tcl使用换行符(和分号)作为命令分隔符。这是基本语法的核心部分。您无法解决它,因此必须使用双引号或大括号来避免反斜杠。让我们看一下可能性(请记住,列表分隔符可以是任何非空的空白序列)。
丑陋,带有反斜杠的易于出错的list
set pets [list \
cat \
dog \
$elephant \
]
大括号,无替代
set pets {
cat
dog
$elephant
}
(请注意,在上面,
$elephant
只是一个字符序列,而不是读取的变量。)用双引号引起替换,但要小心!
set pets "
cat
dog
$elephant
"
通过“小心!”我的意思是,如果列表中有多词成员,则需要使用内部
[list …]
或其他引号:set pets "
cat
dog
[list $elephant]
[list "elephant's child"]
"
但这对于顶部的
list
+反斜杠是正确的。使用
subst
…set pets [subst {
cat
dog
$elephant
"elephant's child"
}]
我可以使用以下方法“清理”(并避免其他潜在问题):
set pets [list {*}[subst {
cat
dog
[list $elephant]
[list "elephant's child"]
}]]
但是坦率地说,如果事情变得非常复杂,那么我实际上是这样做的:
用几个命令构造
set pets {
cat
dog
}
lappend pets $elephant "elephant's child"
当两个或两个以上命令可以解决所有问题且问题较少时,不费吹灰之力就可以使用一个命令。
关于tcl - 整齐地在多行中列出值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22629160/