我想创建带有某些选项的tcl过程。我知道带有参数和可选参数的过程,但不知道选项。例如,如果我通过以下三种方式调用过程arith(-add用于加法,-sub用于减法):
1) arith 10 5
2) arith -add 10 5 or arith 10 5 -add
3) arith -sub 10 5 or arith 10 5 -sub
分别输出应为1)15(默认情况下应加),2)15、3)5
如何在Tcl中编写此程序?我是tcl的新手,请向我建议一些有关Tcl的在线材料或书籍。
复杂的参数解析可以使用cmdline
package完成,它是Tcllib的一部分。键盘命令为cmdline
,可从变量中提取选项并返回描述它们的字典。它还会修改变量,使其仅包含剩余的参数。
::cmdline::getoptions
演示用法(包括一些错误情况):
package require cmdline
proc arith args {
set options {
{op.arg "add" "operation to apply (defaults to 'add')"}
}
array set parsed [::cmdline::getoptions args $options]
if {[llength $args] != 2} {
return -code error "wrong # args: must be \"arith ?-op operation? x y\""
}
switch $parsed(op) {
add {return [::tcl::mathop::+ {*}$args]}
sub {return [::tcl::mathop::- {*}$args]}
default {
return -code error "Unknown -op \"$parsed(op)\": must be add or sub"
}
}
}
主要要注意的是,如果希望将参数传递为,则选项描述符最后使用选项名称[[没有前导% arith
wrong # args: must be "arith ?-op operation? x y"
% arith 2 3
5
% arith -op sub 2 3
-1
% arith -op mult 2 3
Unknown -op "mult": must be add or sub
和with -
好。
.arg
有了这个,您可以将参数放入数组中,
-op add -values {10 5} -op sub -values {10 5}
其中array set aArgs $args
只是传递给过程的参数。
args
proc arith {args} {
if {[catch {array set aArgs $args} err]} {
puts "Error : $err"
return 0
}
if {![info exists aArgs(-op)] || ![info exists aArgs(-values)] || [llength $aArgs(-values)]!=2} {
puts "Please pass valid args"
return 0
}
set x [lindex $aArgs(-values) 0]
set y [lindex $aArgs(-values) 1]
switch $aArgs(-op) {
"add" {
puts [expr {$x+$y}]
}
"sub" {
puts [expr {$x-$y}]
}
}
}
arith -op add -values {10 5}
或-add
。只需进行更改。[计算中有一个优化...使用lrange和:: mathop ::。
add
示例:
proc arith args { if {[llength $args] != 3} { return -code error "wrong # args: must be \"arith ?-op operation? x y\"" } set isadd [lsearch $args add] set issub [lsearch $args sub] if {$isadd != -1 && $issub == -1} { return [expr [lindex $args 1] + [lindex $args [expr $isadd == 0 ? 2: 0]]] } if {$issub != -1 && $isadd == -1} { return [expr [lindex $args [expr $issub == 0 ? 1: 0]] - [lindex $args [expr $issub == 0 ? 2: 1]]] } return -code error "Unknown -op must be add or sub" }
这两个错误示例被注释掉,因为我需要一个捕获器,但是它实际上取决于全局以及其可重复使用性。
#arith add 1 2 3 #arith add sub 2 puts [arith add 1 2] puts [arith 1 2 add] puts [arith sub 1 2] puts [arith 1 2 sub]