2

わかりました、だから私はこれがどのように機能するのか理解できないようです. 「switch -regexp -- $line {」(および基本的にファイルの残りの部分) 内から呼び出された「\t」(「#」アーム行 1) の実行中に、実行時に添付コードが無効なコマンド名「」になる

私はこの問題に遭遇し、最終的に # がそれを実行していることに気付きました。regsub を使用してエスケープしようとしました (以下を参照)。解析する文字列を取得できる唯一の方法は、文字列から # をすべて一緒に削除することです (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"

更新: コメントの紛らわしい性質を (ある程度) 説明しているこのリソースを見つけましたが、それについて何ができるかまだわからないと思います

4

1 に答える 1

4

私はあなたが何をしようとしているのかについて100%明確ではないので、これがあなたの質問に答えない場合は事前にお詫びしますが、結論は、#コマンドが期待される場所でない限りコメントを示しません. たとえば、次のようになります。

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

これを印刷します:

'a#b' contains '#'

文字列a#bが regex と正常に一致するため#です。

$lineが含まれているため#、コード:

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

次のコマンドを実行します。

^[ \t]*TEST.*$

これは(角括弧のため)次のコマンドを実行します:

\t

"   "そのため、 (つまり、タブ文字) が無効なコマンド名であることを知らせるエラー メッセージが表示されます。

a の 1 つのブランチを無効にする場合は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 に答える