用于在TCL中解析参数的包

用于在TCL中解析参数的包,tcl,command-line-arguments,Tcl,Command Line Arguments,有人知道tcl可以轻松解析输入参数的标准包吗?还是一个现成的程序?(我只有3个标志,但最好是通用的)。Tcllib有这样一个包。这有点文档不足,但它是有效的。包括一个示例。下面是一个简单的例子: package require cmdline set parameters { {server.arg "" "Which server to search"} {debug "Turn on debugging, default=off"} } set u

有人知道tcl可以轻松解析输入参数的标准包吗?还是一个现成的程序?(我只有3个标志,但最好是通用的)。

Tcllib有这样一个包。这有点文档不足,但它是有效的。

包括一个示例。下面是一个简单的例子:

package require cmdline

set parameters {
    {server.arg ""   "Which server to search"}
    {debug           "Turn on debugging, default=off"}
}

set usage "- A simple script to demo cmdline parsing"
array set options [cmdline::getoptions ::argv $parameters $usage]
parray options
运行示例:

$ tclsh simple.tcl 
options(debug)  = 0
options(server) = 

$ tclsh simple.tcl -server google.com
options(debug)  = 0
options(server) = google.com

$ tclsh simple.tcl -server google.com -debug
options(debug)  = 1
options(server) = google.com

$ tclsh simple.tcl -help
simple - A simple script to demo cmdline parsing
 -server value        Which server to search <>
 -debug               Turn on debugging, default=off
 -help                Print this message
 -?                   Print this message

    while executing
"error [usage $optlist $usage]"
    (procedure "cmdline::getoptions" line 15)
    invoked from within
"cmdline::getoptions ::argv $parameters $usage"
    invoked from within
"array set options [cmdline::getoptions ::argv $parameters $usage]"
    (file "simple.tcl" line 11)
样本运行2:

$ tclsh simple.tcl -?
simple - A simple script to demo cmdline parsing
 -server value        Which server to search <>
 -debug               Turn on debugging, default=off
 -help                Print this message
 -?                   Print this message
$tclsh simple.tcl-?
simple-演示cmdline解析的简单脚本
-要搜索的服务器的服务器值
-调试打开调试,默认值=关闭
-帮助打印此邮件
-?                   打印此邮件

这是一个简单的、本机的、无包参数解析器:

#
# arg_parse simple argument parser
# Example `arg_parse {help version} {with-value} {-with-value 123 positional arguments}`
# will return:
# `positionals {positional arguments} with-value 123`
#
# @param boolean_flags flags which does not requires additional arguments (like help)
# @param argument_flags flags which requires values (-with-value value)
# @param args the got command line arguments
#
# @return stringified array of parsed arguments
#
proc arg_parse { boolean_flags argument_flags args } {
    set argsarr(positionals) {}

    for {set i 0} {$i < [llength $args]} {incr i} {
        set arg [lindex $args $i]
        if { [sstartswith $arg "-" ] } {
            set flag [string range $arg 1 end]
            if { [lsearch $boolean_flags $flag] >= 0 } {
                set argsarr($flag) 1
            } elseif { [lsearch $argument_flags $flag] >= 0 } {
                incr i
                set argsarr($flag) [lindex $args $i]
            } else {
                puts "ERROR: Unknown flag argument: $arg"
                return
            }
        } else {
            lappend argsarr(positionals) $arg
        }
    }
    return [array get argsarr]
}
使用我的超棒程序:

% my_awesome_proc -help
argsarr(help)        = 1
argsarr(positionals) = 
% my_awesome_proc -with-value 123
argsarr(positionals) = 
argsarr(with-value)  = 123
% my_awesome_proc -wrong
ERROR: Unknown flag argument: -wrong
% my_awesome_proc positional arguments
argsarr(positionals) = positional arguments
% 

非常感谢,有什么方法可以声明必需的参数和可选的参数吗?没有指定必需的参数的规定——一切都是可选的。您必须根据默认值测试每个选项,以确定命令行中是否缺少某个选项。好的,最后一个问题-是否有支持的显示帮助菜单/用法的方法?我已更新以删除指定给
-debug
的默认值以修复帮助输出。。。现在,我想知道是否有办法将布尔参数的默认值设置为
1
。该库似乎接受使用
+debug
语法将此类选项设置为
0
。我刚刚尝试添加
1
作为
debug
的默认值,但默认值仍然是
0
,cmdline使用
1
作为帮助说明。我猜这样的参数不能设置默认值,默认值总是
0
。想要3个标志都有这样的行为就像用炸弹杀死一只苍蝇一样!
#
# USE argument parser:
#
proc my_awesome_proc { args } {
    array set argsarr [arg_parse "help version" "with-value" {*}$args]
    parray argsarr
}
% my_awesome_proc -help
argsarr(help)        = 1
argsarr(positionals) = 
% my_awesome_proc -with-value 123
argsarr(positionals) = 
argsarr(with-value)  = 123
% my_awesome_proc -wrong
ERROR: Unknown flag argument: -wrong
% my_awesome_proc positional arguments
argsarr(positionals) = positional arguments
%