1

我想使用命令行参数将正则表达式列表传递到我的 TCL 脚本中(当前使用 TCL 8.4,但稍后将使用 8.6)。现在,我的脚本有一个可选标志,您可以将其设置为调用-spec,该标志后面是正则表达式列表。(它还有一些其他的可选标志。)

所以这是我希望能够从命令行做的事情:

>tclsh84 myscript.tcl /some/path -someflag somearg -spec "(f\d+)_ (m\d+)_" 

然后在我的脚本中,我会有这样的东西:

set spec [lindex $argv [expr {[lsearch $argv "-spec"] + 1}]]
foreach item $spec {
    do some stuff
}

除了我传入正则表达式列表的部分外,我让它工作。上述方法不适用于传入正则表达式......但是,如果没有引号,它的行为就像两个参数而不是一个,并且大括号似乎也不能正常工作。有更好的解决方案吗?(我是个新手……)

在此先感谢您的帮助!

4

2 回答 2

3

在解析命令行选项时,最简单的方法是有一个简单的阶段将所有这些分开并将其变成更易于在其余代码中使用的东西。或许是这样的:

# Deal with mandatory first argument
if {$argc < 1} {
    puts stderr "Missing filename"
    exit 1
}
set filename [lindex $argv 0]

# Assumes exactly one flag value per option
foreach {key value} [lrange $argv 1 end] {
    switch -glob -- [string tolower $key] {
        -spec {
            # Might not be the best choice, but it gives you a cheap
            # space-separated list without the user having to know Tcl's
            # list syntax...
            set RElist [split $value]
        }

        -* {
            # Save other options in an array for later; might be better
            # to do more explicit parsing of course
            set option([string tolower [string range $key 1 end]]) $value
        }

        default {
            # Problem: option doesn't start with hyphen! Print error message
            # (which could be better I suppose) and do a failure exit
            puts stderr "problem with option parsing..."
            exit 1
        }
    }
}

# Now you do the rest of the processing of your code.

然后您可以检查是否有任何 RE 匹配一些字符串,如下所示:

proc anyMatches {theString} {
    global RElist
    foreach re $RElist {
        if {[regexp $re $theString]} {
            return 1
        }
    }
    return 0
}
于 2013-04-06T11:58:31.520 回答
0

每个模式使用一个-spec,例如 find、grep、sed 等。

set indices [lsearch -all -regexp $argv {^-{1,2}spec$}]
if {[llength $indices] && [expr {[lindex $indices end] + 1}] >= $argc} {
    # bad use
}
foreach index $indices {
    set pattern [lindex $argv [incr index]]
    # ...
}
于 2013-04-06T07:47:45.260 回答