关于tclsh中的getopt和switch-statement



我有一个代码。

如果输入参数匹配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 "--------"
}
}

最后,我在这里得到了解决方案

带括号的开关似乎创建了一个新的命名空间,它隔离了外部变量。

参考此处:

模式和主体参数提供了两种语法。
第一个为每个模式和命令使用单独的参数;如果需要对某些模式或命令进行替换,
这种形式是很方便的。
第二种形式将所有的模式和命令放在一个参数中;参数必须具有适当的列表结构,列表的元素是模式和命令。
第二种形式使得构造多行切换命令变得容易,因为整个列表周围的大括号使得不需要在每行末尾包含反斜杠。由于第二种形式的模式参数在大括号中,因此不会对它们执行命令或变量替换;这使得第二种形式的行为在某些情况下与第一种形式不同。

最新更新