如何使用连字符标志参数创建tcl proc

时间:2015-06-29 07:30:08

标签: tcl

我在互联网上搜索,我想我搜索的不是正确的关键字 我尝试了大部分:)

我想在tcl / bash中创建一个带有连字符标志的proc来获取来自用户的标志的参数

离。

proc_name -color red -somethingselse black

4 个答案:

答案 0 :(得分:4)

实际上,这很容易做到。此代码允许缩写选项名称,标记选项(示例中为-quxwoo)以及使用--标记或出现非选项参数来停止读取选项的功能。在该示例中,未知选项名称会引发错误。传递选项解析循环后,args包含剩余的命令行参数(如果使用的话,不包括--标记)。

proc foo args {
    array set options {-bargle {} -bazout vampires -quxwoo 0}
    while {[llength $args]} {
        switch -glob -- [lindex $args 0] {
            -bar*   {set args [lassign $args - options(-bargle)]}
            -baz*   {set args [lassign $args - options(-bazout)]}
            -qux*   {set options(-quxwoo) 1 ; set args [lrange $args 1 end]}
            --      {set args [lrange $args 1 end] ; break}
            -*      {error "unknown option [lindex $args 0]"}
            default break
        }
    }
    puts "options: [array get options]"
    puts "other args: $args"
}

foo -barg 94 -quxwoo -- abc def
# => options: -quxwoo 1 -bazout vampires -bargle 94
# => other args: abc def

这是它的工作原理。首先设置选项的默认值:

array set options {-bargle {} -bazout vampires -quxwoo 0}

然后输入一个处理参数的循环,如果有的话(左)。

while {[llength $args]} {

在每次迭代中,查看参数列表中的第一个元素:

switch -glob -- [lindex $args 0] {

字符串匹配(“glob”)匹配用于使缩写选项名称成为可能。

如果找到值选项,请使用lassign将值复制到options数组的相应成员,并删除参数列表中的前两个元素。

-bar*   {set args [lassign $args - options(-bargle)]}

如果找到了一个标志选项,请将options数组的相应成员设置为1,并删除参数列表中的第一个元素。

-qux*   {set options(-quxwoo) 1 ; set args [lrange $args 1 end]}

如果找到特殊--标记,请将其从参数列表中删除并退出选项处理循环。

--      {set args [lrange $args 1 end] ; break}

如果找到尚未处理的选项名称,则引发错误。

-*      {error "unknown option [lindex $args 0]"}

如果第一个参数与上述任何一个都不匹配,我们似乎已经用完了选项参数:只需退出循环。

default break

文档:arraybreakerrorlassignlindexllengthproc,{{3 }},putssetswitch

答案 1 :(得分:2)

在Tcl中处理此问题的常用方法是将值插入数组或字典中,然后从中挑选出来。它没有提供最大量的错误检查,但这么容易才能正常工作。

withNewWindow({ button.click() }, close: false, wait: true) {
    //Other things
    withConfirm { driver.close() }
}

执行错误检查需要付出更多努力。这是一个简单的版本

proc myExample args {
    # Set the defaults
    array set options {-foo 0 -bar "xyz"}
    # Read in the arguments
    array set options $args
    # Use them
    puts "the foo option is $options(-foo) and the bar option is $options(-bar)"
}

myExample -bar abc -foo [expr {1+2+3}]
# the foo option is 6 and the bar option is abc

答案 2 :(得分:1)

使用array set,我们可以将参数及其值分配到数组中。

proc getInfo {args} {
    # Assigning key-value pair into array
    # If odd number of arguments passed, then it should throw error
    if {[catch {array set aInfo $args} msg]} {
        return $msg
    }
    parray aInfo; # Just printing for your info
}


puts [getInfo -name Dinesh -age 25 -id 974155]

将产生以下输出

aInfo(-age)  = 25
aInfo(-id)   = 974155
aInfo(-name) = Dinesh

答案 3 :(得分:0)

    #flag defaults
    set level 1
    set inst  ""

    # Parse Flags   
    while {[llength $args]} {
        set flag [lindex $args 0]
        #puts "flag: ($flag)"

        switch -glob $flag {
            -level  {
                set level [lindex $args 1]
                set args  [lrange $args 2 end]
                puts "level:($level) args($args)"

            } -inst {
                set autoname 0
                set inst  [lindex $args 1]
                set args  [lrange $args 2 end]
                puts "inst:($inst) args($args)"

            } -h* {
                #help
                puts "USAGE:"
                exit 1

            } -* {      
                # unknown option            
                error "unknown option [lindex $args 0]"

            } default break
        }
    }

    # remaining arguments   
    set filename "$args"    
    puts "filename: $args"