如何在 tcl 中取消设置 arg
How to unset an arg in tcl
我正在从命令行获取参数并将所有这些参数传递给另一个程序(使用 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
}
}
}
但我不知道如何取消设置我使用的那些参数。例如,我需要取消设置 [lindex $arguments [expr {$var+1}]]
和 [lindex $arguments $var]
.
我就是这样 运行 $program
:
if {[catch {spawn $program --text {*}$arguments}]} {
puts "E: Launcher not found: $program"
exit 1
}
我是这样做的:
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}]]
如果你的参数都是 key-value,那么你可以用 foreach
成对地迭代参数,并建立一个只包含你感兴趣的参数的新列表。
set newarguments [list]
foreach {arg value} $arguments {
switch -exact -- $arg {
"-lp" -
"--launcher-path" {
set program $value
}
default {
lappend newarguments $arg $value
}
}
}
如果您有混合标志和 key-value 选项,那么您将需要使用索引进行迭代,类似于您的代码,但构建新的参数列表将大致相同。
您也可以查看 tcllib cmdline
package,尽管它不处理长选项。
我正在从命令行获取参数并将所有这些参数传递给另一个程序(使用 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
}
}
}
但我不知道如何取消设置我使用的那些参数。例如,我需要取消设置 [lindex $arguments [expr {$var+1}]]
和 [lindex $arguments $var]
.
我就是这样 运行 $program
:
if {[catch {spawn $program --text {*}$arguments}]} {
puts "E: Launcher not found: $program"
exit 1
}
我是这样做的:
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}]]
如果你的参数都是 key-value,那么你可以用 foreach
成对地迭代参数,并建立一个只包含你感兴趣的参数的新列表。
set newarguments [list]
foreach {arg value} $arguments {
switch -exact -- $arg {
"-lp" -
"--launcher-path" {
set program $value
}
default {
lappend newarguments $arg $value
}
}
}
如果您有混合标志和 key-value 选项,那么您将需要使用索引进行迭代,类似于您的代码,但构建新的参数列表将大致相同。
您也可以查看 tcllib cmdline
package,尽管它不处理长选项。