在我的脚本中做完其他一些事情后,我最终得到了一系列在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]]]
根据atomselect
和selections2mol
的输出和输入格式,如果不进行一些微调,后者实际上可能无法工作,但应该值得一试。
在后一种情况下,您不会获得变量,但每个值都可用为
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)
}
文档: 附加 数组 康卡特, 字典, 福里奇, 列表 莱索特, 设置