我有很多tcl脚本和所有相同的regexp条目。
regexp一个示例:
if {[regexp -nocase {outl} $cat]} { set cat "outlook" }
如何将我所有的正则表达式插入文件中并在proc中加载?
示例:
proc pub:mapping {nick host handle channel text} {
set cat [lindex [split $text] 1];
#regexp i want hier load the file for regexp
if {[regexp -nocase {outl} $cat]} { set cat "outlook" }
putnow "PRIVMSG $channel :new $cat"
}
致谢
答案 0 :(得分:1)
如果我对您的理解正确,那么您现在有一堆Tcl脚本,其中大部分代码被重复(在您的情况下,各种正则表达式比较)。在这种情况下,将代码提取到一个单独的单元中很有意义。
正如您所建议的那样,这可能成为一种文本文件,您可以在其中以某种格式列出正则表达式及其结果,然后在需要时在Tcl脚本中加载它们。但是我觉得这太复杂而且笨拙。
可能我建议您仅创建一个正则表达式检查proc并将其保存到.tcl文件中。如果您需要在其他任何脚本中进行正则表达式检查,则可以简单地获取该文件并提供可用的proc。
根据您的问题,我不太确定您打算如何使用这些正则表达式比较,但是也许这个示例可以有所帮助:
# This is in regexfilter.tcl
proc regexfilter {text} {
if {[regexp -nocase {outl} $text]} { return "Outlook" }
if {[regexp -nocase {exce} $text]} { return "Excel" }
if {[regexp -nocase {foo} $text]} { return "Bar" }
# You can have as many options here as you like.
# In fact, you should consider changing all this into a switch - case
# The main thing is to have all your filters in one place and
# no code duplication
}
#
# This can then be in other Tcl scripts
#
source /path_to_filter_scipt/regexfilter.tcl
proc pub:mapping {nick host handle channel text} {
set cat [lindex [split $text] 1]
set cat [regexfilter $cat]
putnow "PRIVMSG $channel :new $cat"
}
答案 1 :(得分:0)
如果您只想扩展缩写词,则可以使用string map
proc expand_abbreviations {string} {
# this is an even-numbered list mapping the abbreviation to the expansion
set abbreviations {
outl outlook
foo foobar
ms Microsoft
}
return [string map $abbreviations $string]
}
这种方法将很快。但是,如果字符串已经包含“ outlook”,则它将变成“ outlookook”