TCL,regexp函数和if语句

fer*_*njb 0 regex if-statement tcl activestate

我有以下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]"
    }
Run Code Online (Sandbox Code Playgroud)

我想检查regexp函数描述的格式是否正确.当in_val var具有正确的格式时,一切都很好,if块是exectuted.但是,当格式错误时,我得到以下错误,而不是输入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)
Run Code Online (Sandbox Code Playgroud)

我正在使用ActiveState ActiveTcl 8.5.11.1 for windows.当val_ok = 0且正则表达式不匹配时,是否知道错误出现的原因?谢谢!

JB

sle*_*man 5

这是因为你正在尝试执行$in_val:

puts "Wrong format, stimulus [$in_val]"
                                 ^
                                 |
               you are trying to execute $in_val here
Run Code Online (Sandbox Code Playgroud)

看方括号?删除它们可以防止错误:

puts "Wrong format, stimulus : $in_val"
Run Code Online (Sandbox Code Playgroud)

如果您仍想打印方括号,则可以反斜杠转义:

puts "Wrong format, stimulus \[$in_val\]"
Run Code Online (Sandbox Code Playgroud)