在switch语句Tcl中设置变量值

时间:2014-08-21 04:38:43

标签: switch-statement tcl

尝试根据第三个变量中的用户输入设置两个变量值。我试图使用switch语句,但我不确定它是否真的可能。

switch $sample_type_input {
  CORE { set sample_type 1 \
       set cutting ""}
  SWC  { set sample_type 2 \
       set cutting ""}
  CUTT { set sample_type 3 \
       set cutting "CUTT" }
}

我一直在弄错#args:应该是"设置varName?newBalue?"`错误。

2 个答案:

答案 0 :(得分:0)

我的脚本中的其他地方找到了答案。 @Hoodiecrow关于\是正确的,他们需要删除,但不幸的是,我从我的代码的其他部分得到了同样的错误。

答案 1 :(得分:0)

行末尾的反斜杠用作行继续,将此行和下一行连接成单个逻辑代码行。由于解析规则,在必须将命令调用分解为两行或更多行的情况下,这是必要的:

set foo
    bar

被解释为两个命令调用:set foobar

set foo \
    bar

是单个命令调用:set foo bar

请注意,反斜杠必须是换行符之前的最后一个字符:例如反斜杠和换行符之间的空格只是使调用以一个常规空格和一个带引号的空格结束:

# there is a space after the backslash here
set foo \ 
puts "{$foo}"
# => { }

如果你的命令调用在大括号中包含一个参数,那么通常可以将它分成几行而没有反斜杠,因为包括换行符在内的所有空格都被大括号引用:

set foo {
    bar
    baz
}

实际上,如果大括号内的参数是包含多个命令调用的脚本,则需要将其分解为行(或插入分号),因为换行符作为命令行分隔符很重要。因此失败了:

if {true} {set foo bar \
    set baz quz}

因为它将两个命令调用连接到单个代码行set foo bar set baz quz,当set命令期望一个或两个时,为if {true} {set foo bar ; set baz quz} 命令提供五个参数。正确的方法是将其写为

if {true} {set foo bar
    set baz quz}

if {true} {
    set foo bar
    set baz quz
}

让分号或换行符分隔脚本参数中的命令调用。文体约定是在多行脚本参数的开头和结尾添加其他换行符,如下所示:

if {true}
{
    set foo bar
    set baz quz
}

这类似于C大括号样式,但不完全相同。一个常见的初学者错误是尝试使用其他一些C支撑约定,例如

if

这是行不通的,因为它引入了第一个和第二个参数之间的代码行分隔换行符if {true} \ { set foo bar set baz quz } 。如果你不能没有这个支撑惯例,你需要添加一个续行:

{{1}}

文档:ifputssetSummary of Tcl language syntax

(注意:评论中提到的'Hoodiecrow'是我,我之前使用过那个昵称。)