arguments - 如何将参数传递给 TCL 源

标签 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 过程将把这个字符串作为一个参数。有什么办法可以解决这个问题吗?

最佳答案

您想要参数扩展。 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/

相关文章:

python - Pygame 延迟参数

math - 为什么atan2的参数是Y,X而不是X,Y?

gradle - 如何解析Gradle任务参数

linux - 期望脚本运行 shell 命令

c++ - 使用TCL命令行,有没有办法停止显示字符?

tcl - 执行 cmd.exe tcl

c - 如何链接到 Tcl C API 中的 tclOO 函数

将参数分配给变量的python函数

python - 如果另一个互斥参数为真,则将默认值设置为假

ssh - 如何使用 'expect' 将公钥复制到主机?