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



我正在尝试使用 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 }
}
}

我该如何解决此问题? 谢谢。

鉴于给出的错误消息以及错误消息中的行号与您告诉我们的脚本中的行数之间的差异,我猜您在提出问题之前已经稍微修剪了脚本。这将是完全可以的(也是一件好事),除了在修剪过程中您删除了导致问题的东西!您发布的代码没有问题。

几乎可以肯定,该问题出在您删除的testdata行之一中。要么是您将列表格式错误地testdata,要么是在您为eval "spawn …"进行串联时生成格式错误的脚本;不幸的是,我无法确定您提供给我们的信息是哪个。(这也可能是expect中的一个问题,当参数在大括号中时,它不喜欢从变量中获取值;expect的文档对这种情况不是很清楚,但它给出了它可能做你想要的提示。

一个好的开始是更新脚本以实际使用 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}右引号和左大括号之间没有空格);由于这在您的完全控制之下,你只需要修复它......

最新更新