0

私は次のTCLコードを持っています:

    #wrong format:
    set in_val "12 0 2 0 0 0 1 0 3 698"
    #correct format:
    #set in_val "12 0 1 0 0 0 1 0 3 698"
    set val_ok [regexp {(\d+)\s([01]\s)([01]\s)([01]\s)([01]\s)([01]\s)([01]\s)([01]\s)(\d+)\s(\d+).*} $in_val Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11]
    if {$val_ok==1} {
       # correct format
       puts "Correct format, continuing..."
       puts "$Var2 $Var3 $Var4 $Var5 $Var6 $Var7 $Var8 $Var9 $Var10 $Var11"
    } else {
       # wrong format
       puts "Wrong format, stimulus [$in_val]"
    }

正規表現関数で記述された形式が正しいかどうかを確認したい。in_val varの形式が正しい場合、すべてが正常であり、ifブロックが実行されます。ただし、形式が間違っていると、elseブロックに入る代わりに、次のエラーが発生します。

invalid command name "12 0 2 0 0 0 1 0 3 698"
    while executing
"$in_val"
    invoked from within
"if {$val_ok==1} {
# correct format
puts "Correct format, continuing..."
puts "$Var2 $Var3 $Var4 $Var5 $Var6 $Var7 $Var8 $Var9 $Var10 $Var11"

} else {..."
    (file "xxx.tcl" line 3)

私はWindowsにActiveStateActiveTcl8.5.11.1を使用しています。val_ok = 0で正規表現が一致しない場合にエラーが表示される理由について何か考えはありますか?ありがとう!

JB

4

1 に答える 1

5

それはあなたが実行しようとしているからです$in_val

puts "Wrong format, stimulus [$in_val]"
                                 ^
                                 |
               you are trying to execute $in_val here

角かっこが表示されますか?それらを削除すると、エラーを防ぐことができます。

puts "Wrong format, stimulus : $in_val"

それでも角かっこを印刷したい場合は、それらをバックスラッシュでエスケープできます。

puts "Wrong format, stimulus \[$in_val\]"
于 2012-06-22T09:04:24.680 に答える