Tcl 如何将一个参数传递到另一个参数

Tcl 如何将一个参数传递到另一个参数,tcl,argument-passing,Tcl,Argument Passing,我想传递一个参数(键值),键值内部可能包含like key(value1 value2…),value也可能是value1(data1 data2 data2)。格式如下所示 proc find {args } { array set opt {-find "" } if {$opt(-find) == "?" } { .... puts "list of search items like google, msn" } if {$

我想传递一个参数(键值),键值内部可能包含like key(value1 value2…),value也可能是value1(data1 data2 data2)。格式如下所示

proc find {args } {
    array set opt {-find "" }
    if {$opt(-find) == "?" } {
        ....
        puts "list of search items like google, msn"
    }
    if {$opt(-find) == "google" } {
        ....
        puts "...."
    }
}
我正在尝试获取命令

find -find ? displayresults google, msn.... find -find google displayresults gmail.... find -find google gmail results username pw ... find -find google gmail pw displayresults .... 找-找? 显示结果谷歌,msn。。。。 查找-查找谷歌 显示结果gmail。。。。 查找-查找谷歌gmail 结果用户名pw。。。 查找-查找谷歌gmail pw 显示结果。。。。
您需要的是
cmdline
包。这里有一个小例子,让你开始

package require cmdline

proc find {args} {
    set flags {
        {server.arg ""   "Which server to search"}
    }

    array set options [cmdline::getoptions args $flags]

    if {$options(server) eq "google"} {
        puts "Search Google"
    } elseif {$options(server) eq "?"} {
        puts "Display Help"
    }
}

# Example usages    
find -server google one two three  ;# Case 1: $options(server)=="google"
find -server ?                     ;# Case 2: display help
find                               ;# Case 3: no -server flag
find -server "google msn" one two  ;# Case 3: $options(server)=="google msn"
讨论
  • 我调用我的标志
    -server
    ,而不是
    -find
    ,我认为这更有意义
  • 在用户不提供
    -server
    标志的情况下,$options(server)是空字符串,
    “”
  • 其余的案例是不言自明的

考虑使用
开关
,因为这样在文本之间进行选择时会在内部构建一个哈希表。好主意。我使用if命令是因为OP可以轻松地使用它。我可以使用分层方法而不是package require cmdline吗?什么是分层方法?我如何以分层方式或树状结构使上述函数成为find-server google(…在此处执行操作)find-server google.gmail find-server google.gmail.username建议我不带软件包