好的,所以我似乎无法弄清楚它是如何起作用的。运行时附加的代码会导致执行“\ t”(“#”第1行)从“switch -regexp - $ line {”(基本上是文件的其余部分)中调用的无效命令名“” / p>
我遇到了这个问题,终于想通了#正在做的事情,我尝试使用regsub转义它(如下所示)。我可以解析字符串的唯一方法是从字符串中删除#all(inputString更改为删除#符号)。
基于TCL将所有行作为文本(包括命令)读取的语句,我只能假设正在读取的字符串包含#并且无法完成该行,当然返回错误。然而逃避(试过1 \和2 \)并没有做任何事情来使它变得更好它所做的只是添加\到我所有的其他“非单词字符”(我曾经 - 工作正常,但现在有\是......:S)
如果我删除或取消注释切换部分{^ [\ t] TEST。 $},那就可以了。
我正在修改一个脚本而忽略了特定的几个案例,并决定将它们评论出来。
有人可以解释一下究竟发生了什么,以及我能做些什么来解决它?似乎.tcl文件仍在解析#部分,即使它们是注释,也会感到困惑。
尝试修复
regsub -all {\W} $line {\\&} line;
代码:
proc doConversion fname {
set inputString "* |# Bits\n* # Bits \n";
foreach line [split $inputString "\n"] {
switch -regexp -- $line {
# {^[ \t]*TEST.*$}
# {
# # Do nothing
# }
default {
}
}
}
}
doConversion "test"
更新: 我确实找到了这个资源,它解释了(在某种程度上)评论的混乱性,但我想我仍然不确定我能做些什么:"Why can I not place unmatched braces in Tcl comments"。
答案 0 :(得分:4)
我不是100%明确你要做的事情,所以如果这不能回答你的问题,我会事先道歉,但是:结果是,#
并不表示评论,除非它在某个地方预期命令。例如,这个:
switch -regexp a#b {
# {
echo 'a#b' contains '#'
}
}
打印出来:
'a#b' contains '#'
因为字符串a#b
与正则表达式#
成功匹配。
由于$line
包含#
,您的代码为:
switch -regexp -- $line {
# {^[ \t]*TEST.*$}
...
}
将运行此命令:
^[ \t]*TEST.*$
(由于方括号)运行此命令:
\t
因此您收到一条错误消息,告诉您" "
(即标签字符)是无效的命令名称。
如果你想禁用switch
的一个分支,你最好将其包装在一个永远不会满足的条件下:
proc doConversion fname {
set inputString "* |# Bits\n* # Bits \n";
foreach line [split $inputString "\n"] {
switch -regexp -- $line {
this-regexp-will-never-match {
{^[ \t]*TEST.*$}
{
# # Do nothing
}
}
default {
}
}
}
}
doConversion "test"