TCL, функция регулярного выражения и оператор if

У меня есть следующий фрагмент кода 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 имеет правильный формат, все в порядке, блок 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)

Я использую ActiveState ActiveTcl 8.5.11.1 для Windows. Любая идея о том, почему ошибка появляется, когда val_ok=0 и регулярное выражение не совпадает? Спасибо!

J-B


person feronjb    schedule 22.06.2012    source источник


Ответы (1)


Это потому, что вы пытаетесь выполнить $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\]"
person slebetman    schedule 22.06.2012
comment
Действительно, вы правы. Я знал, что писать это таким образом не имело никакого смысла, но я не думал, что это было причиной моей ошибки, поскольку это не было указано в ошибке. Спасибо, в любом случае! - person feronjb; 22.06.2012