引号中的TCL列表元素后跟}而不是空格

时间:2015-04-14 21:47:17

标签: string list tcl expect

我试图使用TCL在一个小程序上编写自动验证测试。它应评估输入h1 = 7并在输出为7.000000时通过。同样,如果输出为9.0000,则输入h1 = 9应该通过。但是,我收到以下错误:

ERROR: list element in quotes followed by "}" instead of space
    while executing
"foreach pattern $testdata {
    set inputs   [ lindex $pattern 0 ]
    set expected [ lindex $pattern 1 ]

    eval "spawn $CLIC $inputs"
    expect {..."
    (file "./test/clic/test-clic.exp" line 22)

以下是代码:

#!/usr/bin/expect
set tool "clic"
set CLIC "./clic "

set testdata {
    {"h1=7" "7.000000"}
    {"h1=9" "9.000000"}
}

# global CLIC
foreach pattern $testdata {
    set inputs   [ lindex $pattern 0 ]
    set expected [ lindex $pattern 1 ]

    eval "spawn $CLIC $inputs"
    expect {
        $expected { pass $inputs }
        default   { fail $inputs }
    }
}

我该如何解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:1)

鉴于给出的错误消息以及错误消息中的行号与您告诉我们的脚本中的行数之间的差异,我猜测您已经删除了一些脚本在问这个问题之前。哪个是完美的(和一件好事)除了在修剪过程中你删除了造成问题的东西!您发布的代码没有问题。

问题几乎可以肯定是您删除的testdata行中的一行。您要么将格式错误的列表设为testdata,要么在为eval "spawn …"进行连接时产生格式不正确的脚本;不幸的是,我无法确定您提供给我们的信息。 (它也可能可能 expect中的一个问题,它不喜欢当该参数在括号中时从变量中取值; expect的文档不是& #39;非常清楚这个案例,但它提示它可能做你想做的事。)

一个好的开始是更新脚本以实际使用Tcl 8.6(或Tcl 8.5)的功能,因为您已经在使用该版本。关键变化发生在以下几行:

foreach pattern $testdata {
    set inputs   [ lindex $pattern 0 ]
    set expected [ lindex $pattern 1 ]

    eval "spawn $CLIC $inputs"

写得好得多:

foreach pattern $testdata {
    lassign $pattern inputs expected
    spawn {*}$CLIC {*}$inputs

与之前使用的方式相比,误解的方式要少得多,而且时间也更短。我们还可以将所有内容包装在代码中以提供更好的错误处理:

foreach pattern $testdata {
    if {[catch {
        lassign $pattern inputs expected
        spawn {*}$CLIC {*}$inputs
    } msg]} {
        puts stderr "Problem handling pattern '$pattern': $msg"
        continue
    }

如果你在那时仍然遇到同样的失败,问题几乎可以肯定是你的整体testdata是一个格式错误的列表(并且会出现这样的错误:"something"{something else},关闭之间没有空格引号和开口括号);由于这完全由您控制,您只需要解决它......