如何在 tcl 中向 exec 添加可变数量的参数?
Posted
技术标签:
【中文标题】如何在 tcl 中向 exec 添加可变数量的参数?【英文标题】:How to add a variable amount of arguments to exec in tcl? 【发布时间】:2012-01-22 01:42:55 【问题描述】:我已经和TCL合作了一段时间,我花了很长时间尝试做以下事情(看起来很容易,我认为应该是,但我做错了):
我需要通过 tcl 脚本执行一个外部程序。为此,我使用exec
命令。为了使用这个外部程序,我需要输入可变数量的文件。如果我直接从 cmd 窗口调用这个程序,它会是这样的:
C:\>myprogram -i file1 -i file2 -i file3 (etc., etc.)
但是,当尝试通过 tcl 以动态/可变方式实现此功能时,我遇到了麻烦。我这样做的方法是将我需要的所有“-i filex
”存储在某个变量 myvar 中(在循环中完成),然后将其作为参数传递给exec
命令。它看起来像:
exec myprogram $myvar
这样做显然会产生一些问题,因为这个 myprogram 无法“看到”myvar。我猜有某种隐藏的终结符或不同类型的参数的一些冲突,这使得最后 exec 命令“看到”只有 myprogram。
所以,我的问题是,有谁知道如何将变量参数插入到对exec
的调用中?
【问题讨论】:
【参考方案1】:专为您的案例:
Tcl 8.5(及更高版本):
exec myprogram *$myvar
Tcl 8.4(及之前):
eval [list exec myprogram] [lrange $myvar 0 end]
# Or...
eval [linsert $myvar 0 exec myprogram]
没错,旧版本很丑(或不明显,或两者兼而有之)。因此,人们倾向于这样写:
eval exec myprogram $myvar
但这比预期的要慢(好吧,在运行外部程序时不那么相关!)并且由于eval
的工作方式,$myvar
不是规范格式的列表时存在危险。它曾经甚至可以吸引有经验的 Tcl 程序员,这就是我们在 8.5 中引入新语法的原因,该语法被指定为无意外且非常短。
【讨论】:
【参考方案2】:您可以使用 * 或 eval。例如,请参阅this question。
【讨论】:
感谢您的建议。事实证明,通过一些编辑, eval 似乎可以解决问题。使用 * 是不可能的,因为我使用的是 TCL 8.3,它显然还不接受这个命令。 如果您需要支持 Tcl *(例如我就是这样做的),请务必阅读eval
的章节并引用“Tcl 中的实用编程”和 Tk" 书:beedub.com/book/3rd/Eval.pdf以上是关于如何在 tcl 中向 exec 添加可变数量的参数?的主要内容,如果未能解决你的问题,请参考以下文章