Tcl 要生成的可选参数

Tcl 要生成的可选参数,tcl,expect,Tcl,Expect,我试图用一个可能(或不)存在的参数生成一个进程。我的实际代码如下所示: set optionalParam "" if { somecondition } { set optionalParam someValue } spawn foo.sh paramA paramB "param C" $optionalParam set optionalParam [list] if { somecondition } { lappend optionalParam someVal

我试图用一个可能(或不)存在的参数生成一个进程。我的实际代码如下所示:

set optionalParam ""

if { somecondition } {
    set optionalParam someValue
}

spawn foo.sh paramA paramB "param C" $optionalParam
set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

eval [list spawn foo.sh paramA paramB "param C"] $optionalParam
somecondition
为false时会出现问题
foo.sh
看到一个附加参数,其值为空(如
“”


正确的方法是什么?

有多种正确的方法。就我个人而言,我会将所有参数放入一个列表中,然后在末尾展开列表:

set params {paramA paramB "param C"}
if { somecondition } {
    lappend params someValue
}
spawn foo.sh {*}$params

如果愿意,您可以使用字符串执行相同的操作。

有多种正确的方法。就我个人而言,我会将所有参数放入一个列表中,然后在末尾展开列表:

set params {paramA paramB "param C"}
if { somecondition } {
    lappend params someValue
}
spawn foo.sh {*}$params

如果愿意,您也可以使用字符串执行相同的操作。

如果您使用的是Tcl 8.5或更高版本,您肯定应该使用扩展替换:

set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

spawn foo.sh paramA paramB "param C" {*}$optionalParam

在8.4及之前的版本中,您被迫使用以下内容:

set optionalParam ""

if { somecondition } {
    set optionalParam someValue
}

spawn foo.sh paramA paramB "param C" $optionalParam
set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

eval [list spawn foo.sh paramA paramB "param C"] $optionalParam
这显然很容易出错,而且冗长,许多Tcler倾向于使用快捷方式,如

set optionalParam ""
if { somecondition } {
    set optionalParam someValue
}
eval spawn foo.sh paramA paramB paramC $optionalParam

不过,如果使用
“param C”
,这将“有趣地”失败。或者如果实
someValue
中有空格。(试着为自己设计出为什么,如果你不使用TCL解释器为你做这件事,想想你自己有一个额外的好处。)正是因为这些麻烦,我们在TCL 8.5中添加了扩展语法,这很容易得到正确。

如果你有TCL 8.5或更高版本,您肯定应该使用扩展替换:

set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

spawn foo.sh paramA paramB "param C" {*}$optionalParam

在8.4及之前的版本中,您被迫使用以下内容:

set optionalParam ""

if { somecondition } {
    set optionalParam someValue
}

spawn foo.sh paramA paramB "param C" $optionalParam
set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

eval [list spawn foo.sh paramA paramB "param C"] $optionalParam
这显然很容易出错,而且冗长,许多Tcler倾向于使用快捷方式,如

set optionalParam ""
if { somecondition } {
    set optionalParam someValue
}
eval spawn foo.sh paramA paramB paramC $optionalParam

不过,如果使用
“param C”
,这将“有趣地”失败。或者如果实
someValue
中有空格。(试着为自己设计出为什么,如果你不使用TCL解释器为你做这件事,想想你自己有一个额外的好处。)正是因为这些麻烦,我们在TCL 8.5中添加了扩展语法,这是非常容易得到的。我们当时(大约10年前)通过电子邮件这样做是件好事,否则我们可能会彼此发生暴力。这比在8.6中添加OO支持的争论要糟糕得多……如果我的问题稍微复杂一点,我会坚持你的建议,但是因为这是一个非常简单的用例,简单的列表扩展工作得很好(当然,使用内行距字符串的转义引号)。无论如何,谢谢你的回答和有趣的评论:)ps:“简单扩展”方法有什么缺点吗?我记得关于确切语法的争论;我们当时(大约10年前)通过电子邮件这样做是件好事,否则我们可能会彼此发生暴力。这比在8.6中添加OO支持的争论要糟糕得多……如果我的问题稍微复杂一点,我会坚持你的建议,但是因为这是一个非常简单的用例,简单的列表扩展工作得很好(当然,使用内行距字符串的转义引号)。不管怎样,谢谢你的回答和有趣的评论:)ps:“简单扩展”方法有什么缺点吗?我自己就想出了这个解决方案,但我接受Donal的答案,因为它更完整。谢谢,没问题。他几乎总是有极好的答案;我唯一的希望是在他之前进去我自己精确地想出了这个解决方案,但我接受了Donal的答案,因为它更完整。谢谢,没问题。他几乎总是有极好的答案;我唯一的希望是在他之前进去