整齐地列出多行的值

Dor*_*Dor 11 tcl

如何在每行末尾没有反斜杠的情况下列出多行中的值?

如果最后没有反斜杠,则无法在多行中创建列表.
例如,以下(错误)代码:

set pets [list 
    cat
    dog
    elephant
]
Run Code Online (Sandbox Code Playgroud)

给出错误:

invalid command name "cat"
    while executing
"cat"
    invoked from within
"set pets [list
        cat
        dog
        elephant
]"
Run Code Online (Sandbox Code Playgroud)

它可以通过在行尾添加反斜杠来修复:

set pets [list \
    cat \
    dog \
    elephant \
]
Run Code Online (Sandbox Code Playgroud)

这是丑陋的,容易出错.

请注意:

  • 我知道使用花括号({&}),但它不允许执行命令并且还保留冗余的空格字符.
  • 可以使用任何其他命令(例如dict create),不仅list如我的示例中那样.

使用Tcl 8.5

Don*_*ows 14

Tcl使用换行符(和分号)作为命令分隔符.这是基本语法的核心部分; 你不能解决它所以你必须使用双引号或大括号来避免反斜杠.让我们看一下可能性(记住,列表分隔符可以是任何非空的空格序列).

丑陋,容易出现list反斜杠

set pets [list \
    cat \
    dog \
    $elephant \
]
Run Code Online (Sandbox Code Playgroud)

有大括号,没有替换

set pets {
    cat
    dog
    $elephant
}
Run Code Online (Sandbox Code Playgroud)

(注意,在上面,$elephant只是一个字符序列,而不是变量读取.)

用双引号,换人但要小心!

set pets "
    cat
    dog
    $elephant
"
Run Code Online (Sandbox Code Playgroud)

通过"小心!"我的意思是,如果你有一个列表的多字成员,你需要一个内部[list …]或其他引用:

set pets "
    cat
    dog
    [list $elephant]
    [list "elephant's child"]
"
Run Code Online (Sandbox Code Playgroud)

但是list顶部的+反斜杠也是如此.

使用subst......

set pets [subst {
    cat
    dog
    $elephant
    "elephant's child"
}]
Run Code Online (Sandbox Code Playgroud)

我可能会"清理它"(并避免其他潜在的问题):

set pets [list {*}[subst {
    cat
    dog
    [list $elephant]
    [list "elephant's child"]
}]]
Run Code Online (Sandbox Code Playgroud)

但坦率地说,如果事情变得非常复杂,那么我实际上是这样做的:

使用多个命令构造

set pets {
    cat
    dog
}
lappend pets $elephant "elephant's child"
Run Code Online (Sandbox Code Playgroud)

当两个或更多的人用更少的问题做所有事情时,没有必要抨击自己头脑以使用一个命令.