在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
,它的效果非常好。但是,我只能将arg1
和arg2
作为一个字符串提供,例如:set string "arg1 arg2"
。然后我的src
proc将此字符串作为一个参数。有没有办法解决这个问题?
答案 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
的所有微妙错误......