3

このことは私を殺しています.tcl正規表現の非常に基本的な概念が欠けていると思います. 私は次のコードを持っています

foreach line $data {
    if {[regexp {^(\#|\s)} $line]} {continue;} else {[lappend $puneet "$line"];}
}

#したがって、最初の文字として ' '、または ' \s' スペースまたは通常の英数字文字を持つことができる変数 line があります。今私が望むのは、最初の文字として英数字のみを持つ行のリストを作成することです。

しかし、上記のコードは、見つけられなかった構文の問題により、目的の出力が得られないようです。これは非常に基本的なことですが、私はまだ正規表現の新人なので、上記の式に角かっこがないかどうかわかりません。

4

3 に答える 3

5

if問題は、ステートメントの最後の部分にあります。

[lappend $puneet "$line"];

これにより、変数の現在の値の名前を持つ行の内容が変数に追加されpunneetます。その後、現在の行の名前でコマンドを見つけようとしますが、おそらく失敗します。

正しいです:

foreach line $data {
    if {[regexp {^(\#|\s)} $line]} {continue} else {lappend puneet $line}}
}

Tcl 8.6 を使用している場合は、全体を次のように記述できます。

set puneet [lmap line $data {if {[regexp {^(\#|\s)} $line]} {continue}; set line}
于 2013-09-20T18:21:55.930 に答える
1

lsearchループの代わりにここで使用します。

set data {{# one} two { three} #four five { six}}

set puneet [lsearch -all -inline -not -regexp $data {^(?:#|\s)}]    ;# two five
于 2013-09-20T23:06:48.107 に答える