如何在 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 添加可变数量的参数?的主要内容,如果未能解决你的问题,请参考以下文章

在Android应用程序中向GridView添加一组按钮

pyspark udf 的可变参数数量

将列表传递给 Tcl 过程

如何在 AfNetworking 3.0 中向请求添加标头?

如何制作可变参数宏(可变数量的参数)

如何在 C# 中向 powershellinstance 添加参数