注释如何在regexp switch语句的上下文中工作

时间:2012-07-16 19:56:47

标签: regex tcl

好的,所以我似乎无法弄清楚它是如何起作用的。运行时附加的代码会导致执行“\ 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"

1 个答案:

答案 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"
相关问题