2015-04-09 2 views
0

Я сделал следующий пакет с четырьмя новыми командами, чтобы упростить использование regsub и map. Я использовал эти команды довольно долго и до сих пор хорошо работает. Мне интересно, есть ли у кода недостатки, которые могут иметь нежелательные результаты или ошибки в будущем.Tcl: упаковка упаковки regsub и строка карты *** Поиск побочных эффектов ***

regdel имяПеремарг (удалить из имяПерем регулярных выражений, соответствующих арг)

mapdel имяПеремарг (удалить из имяПерем соответствие строка арг)

regrep имяПеремехрРЕПЛ (заменить ехр в имяПерем с РЕПЛ)

maprep имяПеремстрокаРЕПЛ (замените строку в VarName с РЕПЛ)

Удалите цифры с помощью 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] 
} 

ответ

0

Чтобы избежать столкновения, я бы поставил свои проки в пространстве имен:

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 

Я не так увлекаюсь вашими именами: 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 

Используя ансамбль предложение Донал в:

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 
+0

Я предлагаю сделать ансамбли. –

Смежные вопросы