如何在tcl中取消设置arg

时间:2016-01-15 18:26:38

标签: tcl expect

我从命令行获取参数并将所有这些参数传递给另一个程序(使用expect spawn)。我想解析所有选项并省略其中一些(或做其他事情)。要做到这一点,我这样做:

set arguments [lrange $argv 0 end]

#Check for -lp option. Set the program path 
for {set var 0} {$var<$argc} {incr var} {
    if {[lindex $arguments $var] == "-lp" || [lindex $arguments $var] == "--launcher-path"} {
        if {[lindex $arguments [expr {$var+1}]] != ""} {
            set program [lindex $arguments [expr {$var+1}]]
            #unset [lindex $arguments $var]
        } else {
            puts "E: Argument missing for option: [lindex $arguments $var]"
            exit 1
        }
    }
}

但我无法弄清楚如何取消我使用的那些args。例如,我需要取消设置[lindex $arguments [expr {$var+1}]][lindex $arguments $var]

这就是我运行$program

的方式
if {[catch {spawn $program --text {*}$arguments}]} {
    puts "E: Launcher not found: $program"
    exit 1
}

2 个答案:

答案 0 :(得分:1)

如果你的参数都是键值,那么你可以用foreach成对遍历参数,并建立一个新的列表,其中只包含你感兴趣的参数。

set newarguments [list]
foreach {arg value} $arguments {
    switch -exact -- $arg {
        "-lp" -
        "--launcher-path" {
            set program $value
        }
        default {
            lappend newarguments $arg $value
        }
    }
}

如果你有混合标志和键值选项,那么你需要使用索引进行迭代,类似于你的代码,但是建立新的参数列表将大致相同。

你也可以检查tcllib cmdline package,虽然这不能处理长选项。

答案 1 :(得分:0)

我就是这样做的:

set arguments [lreplace $arguments [expr {$var+1}] [expr {$var+1}]]
set arguments [lreplace $arguments $var $var]

正如glenn-jackman所指出的,上述内容可以缩短为:

set arguments [lreplace $arguments $var [expr {$var+1}]]