TCL参数中的变量RE

时间:2014-07-14 07:59:08

标签: regex tcl

我有一个TCL过程,我试图将变量传递给正则表达式并且它无法识别它。

proc _findit {RE} {
      if [
          regexp -all -nocase $RE $Line Match
         ] {
         #DO STUFF
         }
}

_findit \sword\s

1 个答案:

答案 0 :(得分:4)

在评估_findit的调用时,将消除转义,因此变量RE的内容是字符串"swords"。尝试将模式括在大括号中,这将引用反斜杠并保留转义:

_findit {\sword\s}

找到Tcl语法的文档,包括评估参数的规则here

如果您需要在调用的命令中找到您的参数,请在命令中添加以下行:

puts [info level 0]

在评估调用之后,这将打印完整的参数列表,包括命令名称。

修改以澄清info level的使用:

我当时对info level的文档感到有些困惑,我写的内容并非基于完全正确的理解(但幸运的是大部分都是正确的)。如果在没有参数的情况下调用,info level将返回当前过程调用的堆栈级别编号。如果使用参数调用(必须是数字),则返回由数字指定的堆栈级别的调用(名称和扩展参数)。如果该数字大于0,则将其解释为绝对堆栈级别(1是从顶层调用的过程,2是从堆栈级别1调用的过程,等等)。如果它小于1,则将其解释为相对堆栈级别(0表示此过程,-1表示调用者,-2表示调用者的调用者,等等)。因此,[info level [info level]][info level 0]给出相同的结果(即使[info level]不等于0),因为它们都以不同的方式指示当前的堆栈级别。

这与使用upvaruplevel的编号方案类似,不同之处在于“{relative”堆栈级别为info level写入0,-1,-2,... 0,1,2,...代表up*,而“绝对”堆栈级别分别为info level和#1,#2,#3,...写入1,2,3。 .. for up*(可以将顶级指定为#0)。

文档:info