在 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 过程将把这个字符串作为一个参数。有什么办法可以解决这个问题吗?
最佳答案
您想要参数扩展。 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
中的所有微妙错误...
关于arguments - 如何将参数传递给 TCL 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891296/