我有一个TCL过程,我试图将变量传递给正则表达式并且它无法识别它。
proc _findit {RE} {
if [
regexp -all -nocase $RE $Line Match
] {
#DO STUFF
}
}
_findit \sword\s
答案 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),因为它们都以不同的方式指示当前的堆栈级别。
这与使用upvar
和uplevel
的编号方案类似,不同之处在于“{relative”堆栈级别为info level
写入0,-1,-2,... 0,1,2,...代表up*
,而“绝对”堆栈级别分别为info level
和#1,#2,#3,...写入1,2,3。 .. for up*
(可以将顶级指定为#0)。
文档:info