2013-12-11 4 views
1

Я пытаюсь создать процесс с аргументом, который может (или нет) присутствовать. Мой реальный код выглядит следующим образом:Необязательный аргумент для spawn

set optionalParam "" 

if { somecondition } { 
    set optionalParam someValue 
} 

spawn foo.sh paramA paramB "param C" $optionalParam 

Проблема происходит, когда somecondition ложно. foo.sh видит дополнительный параметр с пустым значением (например, "").

Каков правильный способ сделать это?

ответ

1

Если у вас есть Tcl 8.5 или более поздней версии, вы определенно следует использовать расширяющийся замену:

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

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

В 8.4 и выше, вы вместо того, вынуждены использовать что-то вроде этого:

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

eval [list spawn foo.sh paramA paramB "param C"] $optionalParam 

Это был явно подвержен ошибкам и многословно и многие Tclers склонны использовать ярлыки, как

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

Это не получилось бы «интересно» с "param C". Или, если у реального someValue есть пробел. (Попробуйте выяснить, почему для себя! Подумайте, что у вас есть бонусная точка, если вы можете сделать это, не используя интерпретатор Tcl, чтобы сделать это для вас.) Из-за этих проблем мы добавили синтаксис расширения в Tcl 8.5, который hugely легче получить право.

+0

Я помню бои за точный синтаксис; было хорошо, что мы делали это по электронной почте в то время (около 10 лет назад), или мы, возможно, пришли к насилию друг с другом. Это было намного хуже, чем бои над добавлением поддержки OO в 8.6 ... –

+0

Если бы моя проблема была немного сложнее, я бы придерживался ваших предложений, но, поскольку это довольно простой вариант использования, простое расширение списка работало хорошо (с использованием экранированного цитаты для внутренних разнесенных строк, конечно). Во всяком случае, спасибо за ответ и смешной комментарий :) ps: любой недостаток на подходе «простого расширения»? – tavlima

4

Существует несколько правильных способов сделать это. Лично я бы поставил все Params в список, а затем расширить список в конце:

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

Вы могли бы сделать то же самое с цепочкой, если вы предпочитаете.

+0

Я сам решил это решение, но я принимаю ответ Донала, поскольку он более совершенен. Спасибо, в любом случае. – tavlima

+0

Нет проблем. У него почти всегда есть превосходные ответы; моя единственная надежда состоит в том, чтобы войти, прежде чем он это сделает. :) –

+0

FWIW, я был одним из тех, кто голосовал за ваш ответ. ;-) –

Смежные вопросы