如何在多行中列出值而不在每行末尾加反斜杠?

如果不能在末尾加上反斜杠,则无法在多行中创建列表。
例如,以下(错误)代码:

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/

    10-10 00:12