我有一个代码。
如果输入参数匹配opt,
然后打印opt-content
但结果不是我所期望的:怎么解呢?
我描述如下:
我类型:
$ tclsh t.tcl -B bb -O oo
我:bb
bb
oo
--------
Non
--------
oo
bb
oo
--------
Non
--------
结果似乎不匹配,则打印默认消息,
但参数似乎被读(替换)正确。
package require cmdline
set parameters {
{B.arg "" "Build Dir"}
{O.arg "" "Output Dir"}
}
array set arg [cmdline::getoptions argv ${parameters}]
set requiredParameters {B O }
foreach iter ${requiredParameters} {
if {$arg(${iter}) == ""} {
error "Missing required parameter: -${iter}"
} else {
puts $arg(${iter})
puts $arg(B)
puts $arg(O)
puts "--------"
switch $arg(${iter}) {
$arg(B) {
puts $arg(${iter})
}
$arg(O) {
puts $arg(${iter})
}
default {
puts "Non"
}
}
puts "--------"
}
}
package require cmdline
set parameters {
{B.arg "" "Build Dir"}
{O.arg "" "Output Dir"}
}
array set arg [cmdline::getoptions argv ${parameters}]
set requiredParameters {B O }
foreach iter ${requiredParameters} {
if {$arg(${iter}) == ""} {
error "Missing required parameter: -${iter}"
} else {
puts $arg(${iter})
puts $arg(B)
puts $arg(O)
puts "--------"
switch $arg(${iter}) {
$arg(B) {
puts $arg(${iter})
}
$arg(O) {
puts $arg(${iter})
}
default {
puts "Non"
}
}
puts "--------"
}
}
最后,我在这里得到了解决方案
带括号的开关似乎创建了一个新的命名空间,它隔离了外部变量。
参考此处:
模式和主体参数提供了两种语法。
第一个为每个模式和命令使用单独的参数;如果需要对某些模式或命令进行替换,
这种形式是很方便的。
第二种形式将所有的模式和命令放在一个参数中;参数必须具有适当的列表结构,列表的元素是模式和命令。
第二种形式使得构造多行切换命令变得容易,因为整个列表周围的大括号使得不需要在每行末尾包含反斜杠。由于第二种形式的模式参数在大括号中,因此不会对它们执行命令或变量替换;这使得第二种形式的行为在某些情况下与第一种形式不同。