如何在tcl中设置键控列表?

时间:2014-11-06 10:49:58

标签: tcl

当我要在我的代码中使用 keylset 时,会出现错误 “无效的命令名称”keylset“”< / EM>

set list1 "a 1 b 2 c 3 d 4"
for {set i 0} {$i < [llength $list1]} {incr i} {
    keylset klist [lindex $list1 $i] [lindex $list1 [expr $i+1]]
    set klist
}
puts $klist

请给我一些解决方案。

2 个答案:

答案 0 :(得分:2)

键控列表命令是TclX扩展包的一部分。 为了使它们出现在您的脚本中,您必须发出以下命令(它将安排加载相关的共享库并提供要获取的脚本)。

# Note the lower-case 'x', an annoying inconsistency but too late to fix it now...
package require Tclx

# your script here
set list1 "a 1 b 2 c 3 d 4"
for {set i 0} {$i < [llength $list1]} {incr i} {
    keylset klist [lindex $list1 $i] [lindex $list1 [expr $i+1]]
    set klist
}
puts $klist

安装扩展程序包的方式取决于您使用的Tcl分布。如果您正在使用Debian(或其衍生产品),您可能会这样做:

sudo apt-get install tclx8.4

如果您使用的是ActiveTcl发行版,请改为:

teacup update

安装许多软件包的当前版本,其中包括TclX。您可能需要在Windows上的提升命令shell中执行此操作,或在OSX上使用sudo作为前缀。

如果您使用的是OSX并使用MacPorts,则tclx位于MacPorts系统中(也是正确的版本)。

sudo port install tclx

由于有许多可能的发行版,或者你可以自己从源代码构建它,你需要仔细指定你的平台和设置是什么,如果它不是我上面列出的那个。

答案 1 :(得分:0)

您确定您的代码是否正确?它给出了结果

{a 1} {1 b} {b 2} {2 c} {c 3} {3 d} {d 4} {4 {}}

那是你想要的吗?如果你打算得到

{a 1} {b 2} {c 3} {d 4}

你应该在每次迭代中将i的值增加2(incr i 2)。

您可以通过这种方式获得相同的结果(需要Tcl 8.5或更高版本):

set klist [lmap {a b} "a 1 b 2 c 3 d 4" {list $a $b}]

或by(需要Tcl 8.6和TclX包)

keylset klist {*}"a 1 b 2 c 3 d 4"

对于旧版本,这可以做同样的事情:

set klist [list]
foreach {a b} "a 1 b 2 c 3 d 4" {
    lappend klist [list $a $b]
}

文档:foreachlappendlistlmapset{*}

对于TclX文档,this似乎是一个很好的起点。