how to create tcl proc with hyphen flag arguments

后端 未结 4 793
面向向阳花
面向向阳花 2020-12-10 22:06

Im searching all over the internet , i guess im searching not the right keywords i tried most of them :)

i want to create in tcl/bash a proc with hyphen flags to get

4条回答
  •  忘掉有多难
    2020-12-10 22:22

    It's very easy to do, actually. This code allows abbreviated option names, flag options (-quxwoo in the example) and the ability to stop reading options either with a -- token or with a non-option argument appearing. In the example, unknown option names raise errors. After passing the option-parsing loop, args contains the remaining command-line arguments (not including the -- token if it was used).

    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
    

    This is how it works. First set default values for the options:

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

    Then enter a loop that processes the arguments, if there are any (left).

    while {[llength $args]} {
    

    During each iteration, look at the first element in the argument list:

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

    String-match ("glob") matching is used to make it possible to have abbreviated option names.

    If a value option is found, use lassign to copy the value to the corresponding member of the options array and to remove the first two elements in the argument list.

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

    If a flag option is found, set the corresponding member of the options array to 1 and remove the first element in the argument list.

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

    If the special -- token is found, remove it from the argument list and exit the option-processing loop.

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

    If an option name is found that hasn't already been dealt with, raise an error.

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

    If the first argument doesn't match any of the above, we seem to have run out of option arguments: just exit the loop.

    default break
    

    Documentation: array, break, error, lassign, lindex, llength, proc, puts, set, switch, while

提交回复
热议问题