2

好的,所以我似乎无法弄清楚这到底是如何工作的。运行时附加的代码导致无效的命令名称“”,同时执行从“switch -regexp -- $line {”(以及文件的其余部分)中调用的“\t”(“#”arm line 1)

我遇到了这个问题,最后发现 # 正在这样做,我尝试使用 regsub 转义它(如下所示)。我可以解析字符串的唯一方法是如果我从字符串中一起删除 # (inputString 更改为删除 # 符号)。

基于 TCL 将所有行读取为文本(包括命令)的声明,我只能假设正在读取的字符串包含 # 并且无法完成该行,当然返回了错误。然而转义(尝试 1 \ 和 2 \'s)并没有做任何事情来使它更好它所做的只是将 \ 添加到我所有其他“非单词字符”(我有 - 工作正常,但现在有 \的...: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"

更新:我确实找到了这个资源,它(在一定程度上)解释了评论的混乱性质,但我想我仍然不确定我能做些什么:“为什么我不能在 Tcl 评论中放置不匹配的大括号”

4

1 回答 1

4

我不是 100% 清楚你想要做什么,所以如果这不能回答你的问题,我提前道歉,但是:结果是,#除非它在某个地方需要命令,否则不表示评论. 例如,这个:

switch -regexp a#b {
    # {
        echo 'a#b' contains '#'
    }
}

打印这个:

'a#b' contains '#'

因为字符串a#b成功匹配正则表达式#

由于$linecontains #,您的代码:

       switch -regexp  -- $line {
                # {^[ \t]*TEST.*$}
                ...
            }

将运行此命令:

^[ \t]*TEST.*$

其中(由于方括号)运行此命令:

\t

因此您会收到一条错误消息,告诉您"   "(即制表符)是无效的命令名称。

如果要禁用 a 的一个分支,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"
于 2012-07-16T20:50:17.030 回答