具体来说,我可以创建一个列表:
for {set i 0} {$i < $val(recv)} {incr i} {
lappend bwList "videoBW_($i).tr"
close $videoBW_($i)
}
然后我想用
将该列表作为多个文件的参数exec xgraph $bwList -geometry 800x400 &
它会给我错误:
警告:无法打开文件`videoBW_(0).tr videoBW_(1).tr videoBW_(2).tr'
因为tcl将整个列表作为一个字符串而不是多个字符串读取。 有没有办法将列表作为多个字符串读取?
编辑:
tcl8.4的解决方案是Brian Fenton提供的解决方案。 但是通过更改set exec_call {xgraph $ bwList -geometry 800x400} 设置exec_call“xgraph $ bwList -geometry 800x400”
基本上如果你只在exec前添加eval就可以完成这项工作。
eval exec xgraph $bwList -geometry 800x400 &
Fot tcl 8.5 Bryan Oakley提供了更优雅的解决方案。
答案 0 :(得分:4)
如果您使用的是tcl 8.5或更高版本,则可以执行以下操作:
exec xgraph {*}$bwList -geometry 800x400 &
{*}
称为扩展运算符。它在执行语句之前将列表扩展为单个元素。
有关最终解释,请参阅section 5 of the Tcl man page。
答案 1 :(得分:2)
我不完全明白你的意思是“多个字符串”。如果你展示了对xgraph的最终调用应该是什么样子,那对我有帮助。我用xgraph认为文件最后出现了(即在-geometry 800x400之后)?
无论如何,使用 eval 而不是直接调用 exec 可能有所帮助。
set exec_call {xgraph $bwList -geometry 800x400}
set caught [catch {eval exec $exec_call} result]
if { $caught } {
#handle the error - it is stored in $result
} else {
#handle the success
}
答案 2 :(得分:2)
对于Tcl 8.4我会这样做:
set cmd [concat [list exec xgraph] $bwList]
lappend cmd -geometry 800x400
答案 3 :(得分:2)
在8.5及更高版本中:
exec xgraph {*}$bwList -geometry 800x400 &
在8.4及之前:
eval exec xgraph $bwList -geometry 800x400 &
# Or this more formally-correct version...
# eval [list exec xgraph] [lrange $bwList 0 end] [list -geometry 800x400 &]
正如您所看到的,8.5扩展语法有很多帮助,当您从简单的实验转向生产代码时(例如,如果您在该命令行中添加带空格的标签参数),这种情况尤其如此;版本只会正确处理它,但是对于旧版本,您将不得不正确引用所有内容,您可以看到上面的非常凌乱。)