如何将参数传递给TCL源代码

时间:2014-05-27 13:50:25

标签: arguments tcl

在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将此字符串作为一个参数。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

您想要参数展开。 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中添加了{*}正是因为我们厌倦了来自eval的所有微妙错误......