如何在 tcl 中的一个变量中添加许多选择



在我的脚本中做完其他一些事情后,我最终得到了一系列在tcl中设置的变量($sel 1,$sel 2,$sel 3,...),我需要将它们添加到以下行:

set all [::TopoTools::selections2mol "$box $sel1 $sel2 $sel3 $sel4"]

现在,如果我只有四个,手工就可以了,但在最终版本中,我将有数百个,这是手工完成的站不住脚的。我确定答案是某种循环,但我现在一直在考虑它,但我无法完全弄清楚。如果我有,比如说,$sel 1,$sel 2,一直到一个给定的数字,我将如何以我想要的任何数量显示的格式将它们添加到该行中,$box在开头如图所示?非常感谢您的帮助。

它可能相关,也可能不相关,但我在循环中定义变量如下:

set sel$i [atomselect $id all]

我不熟悉您使用的软件,但应该可以毫不费力地解决此问题。

如果你把它放在循环中:

set sell$i [atomselect $id all]
append valueStr " " [set sell$i]

(或者也许是这个,即使它是小C:)

append valueStr " " [set sell$i [atomselect $id all]]

您将获得" $sel1 $sel2 $sel3 $sel4"被替换的字符串(请记住也放入$box)。

使用 Tcl 8.5 或更高版本,您可以

dict set values $i [atomselect $id all]

在循环中,为您提供一个包含所有值的字典结构,然后使用以下命令创建值序列:

set all [::Topotools::selections2mol [concat $box [dict values $values]]]

根据atomselectselections2mol的输出和输入格式,如果不进行一些微调,后者实际上可能无法工作,但应该值得一试。

在后一种情况下,您不会获得变量,但每个值都可用为

dict get $values $i 

您也可以使用数组执行此操作:

set values($i) [atomselect $id all]

但是你需要在收集值之前对键进行排序,就像这样

set valueStr [list $box]
foreach key [lsort -integer [array names values]] {
append valueStr " " $values($key)
}

文档: 附加 数组 康卡特, 字典, 福里奇, 列表 莱索特, 设置

最新更新