如何在tcl中使用列表作为多个字符串的参数(而不是一个字符串)?

时间:2011-05-06 10:14:42

标签: list tcl

具体来说,我可以创建一个列表:

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提供了更优雅的解决方案。

4 个答案:

答案 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扩展语法有很多帮助,当您从简单的实验转向生产代码时(例如,如果您在该命令行中添加带空格的标签参数),这种情况尤其如此;版本只会正确处理它,但是对于旧版本,您将不得不正确引用所有内容,您可以看到上面的非常凌乱。)