Tcl:包裹包裹regsub和字符串地图***寻找副作用***

时间:2015-04-09 08:40:46

标签: regex tcl

我使用四个新命令制作了以下软件包,以简化regsubmap的使用。我一直在使用这些命令已经有一段时间了,到目前为止工作得很好。我想知道代码是否有任何可能在将来产生不良结果或错误的弱点。

regdel varName args (从 varName 正则表达式中移除匹配 args

mapdel varName args (从 varName 字符串中删除匹配 args

regrep varName exp repl (用替换 varName 中的 exp > REPL

maprep varName string repl (将 varName 中的 string 替换为 REPL

使用regdel删除数字

regdel inputFile {[[:digit:]]} 

使用mapdel

删除数字
mapdel inputFile 0 1 2 3 4 5 6 7 8 9

使用regrep

替换空白字符
regrep inputFile {[[:space:]]+} \n

使用maprep

替换空白字符
maprep inputFile " " \n

包裹代码:

package provide myregex 1.0

proc regdel {ref args} {
    upvar 1 $ref var
    foreach match $args {
        regsub -all $match $var "" var
    } 
}

proc mapdel {ref args} {
    upvar 1 $ref var
    foreach match $args {
        set var [string map [list "$match" ""] $var]
    } 
}

proc regrep {ref match repl} {
    upvar 1 $ref var 
    regsub -all $match $var $repl var
}
proc maprep {ref match repl} {
    upvar 1 $ref var
    set var [string map [list "$match" "$repl"] $var]
}

1 个答案:

答案 0 :(得分:0)

为避免冲突,我会将你的procs放在命名空间中:

http://www.tcl.tk/man/tcl8.6/TclCmd/namespace.htm

package provide myregex 1.0
namespace eval myregex {
    namespace export regdel mapdel regrep maprep
    # your code here
}

然后,当你使用它时:

package require myregex

myregex::mapdel file foo bar baz

# or, you decide the risk of collisions in the global namespace
namespace import myregex::*
mapdel file foo bar baz

我不喜欢你的proc名称:regrep看起来像re-grep。考虑子命名空间

namespace eval myregex {
    namespace export regex map
}

namespace eval myregex::regex {
    proc del args ...
    proc rep args ...
}

namespace eval myregex::map {
    proc del args ...
    proc rep args ...
}

然后

namespace import myregex::*
map::del file foo bar baz
regex::rep file hello world

使用Donal的合奏建议:

namespace eval myregex {
    namespace export regex map
    namespace eval regex {
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            regsub -all [join $args "|"] $var "" var
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach {pattern replacement} $args {
                regsub -all $pattern $var $replacement var
            }
        }
        namespace ensemble create
        namespace export *
    }
    namespace eval map {
        namespace ensemble create
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach substr $args {
                lappend map $substr ""
            }
            set var [string map $map $var]
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            set var [string map $args $var]
        }
        namespace ensemble create
        namespace export *
    }
}

然后

namespace import myregex::*

set str "hello world"; regex del str l d;     puts $str
set str "hello world"; regex rep str l L o O; puts $str
set str "hello world"; map del str l d;       puts $str
set str "hello world"; map rep str l L o O;   puts $str

输出

heo wor
heLLO wOrLd
heo wor
heLLO wOrLd