【问题标题】:How to add a variable amount of arguments to exec in tcl?如何在 tcl 中向 exec 添加可变数量的参数?
【发布时间】: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 的调用中?

【问题讨论】:

    标签: variables dynamic arguments exec tcl


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2011-10-09
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2011-07-09
      相关资源
      最近更新 更多