【问题标题】:How to pass arguments to TCL source如何将参数传递给 TCL 源
【发布时间】:2015-09-08 08:34:19
【问题描述】:

在 tcl 中,现在我想获取一个带有一些参数的文件,例如,源文件 arg1 arg2。我使用这样的程序

proc src {file args} {
  set argv $::argv
  set argc $::argc
  set ::argv $args
  set ::argc [llength $args]
  set code [catch {uplevel [list source $file]} return]
  set ::argv $argv
  set ::argc $argc
  return -code $code $return
}

如果我使用src file arg1 arg2,它会完美运行。但是,我只能将arg1arg2 作为一个字符串提供,例如:set string "arg1 arg2"。然后我的src proc 将把这个字符串作为一个参数。有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: arguments tcl


    【解决方案1】:

    你想要参数扩展。 Tcl 对此有特殊的语法(从 8.5 开始):

    src $file {*}$string
    

    看到{*}了吗?如果它在单词中的第一个,则单词的其余部分被解析(作为 Tcl 列表)成多个使用的单词。


    在 8.4 及之前的版本中,您必须改为这样做:

    eval [linsert $string 0 src $file]
    

    或任何数量的其他可怕的食谱。人们倾向于懒惰并写作:

    eval src $file $string
    

    但是如果$file 中有空格,或者$string 被格式化为规范列表以外的任何内容,例如:

    set string {
        arg1
        arg2
    }
    

    这是一个合法的列表。虽然不规范,但会使eval 在没有预防措施的情况下爆炸。

    我们在 8.5 中添加了 {*} 正是因为我们厌倦了 evals 中的所有细微错误……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多