Tcl foreach 循环找不到第二个变量

Tcl foreach loop not finding second variable

我确定之前有人在这里问过这个问题,但我似乎找不到任何 link 可以帮助我解决我的特定问题。

我正在 vmd 中使用 tcl 脚本来进行快速分析。

package require pbctools
set wat [atomselect top "segid HETA"]
set pbcbox [pbc get -now]
set Lz [lindex [lindex $pbcbox 0] 2]
set Qwat 0
puts [$wat get charge]
foreach i{$wat get z} j{$wat get charge} {set $Qwat [expr $Qwat + $j * ($i + 0.5 * $Lz) / $Lz]}
#puts $Qwat

当我 运行 这个脚本时,我得到错误: atomselect 0 表明它设置得很好,100.608742 是盒子 Lz 的长度,它正在寻找每个原子的电荷(有 4 个原子,每个原子带负电荷)。

然而,它在这个 foreach 循环中失败了,我希望它按位置迭代并同时收费。所以列表 1 中的第 1 行和列表 2 中的第 1 行。我已经尝试了我能想到的每个语法迭代,但我似乎无法让这个表达式在 foreach 循环中工作。

我哪里做错了?

问题是您缺少一些空格,以便 Tcl 理解您想要的内容。

因此 foreach i{$wat get z} j{$wat get charge} {} 创建了 3 个变量(假设 $wat 是“atomselect0”):

  1. “i{atomselect0”,值为“get”
  2. “z}”,值为“j{atomselect0”
  3. “get”,值为“charge}”

如您所见,没有变量“j”。 我对你想要的东西的猜测可能是这样的:

foreach i [$wat get z] j [$wat get charge] {
    set $Qwat [expr {$Qwat + $j * ($i + 0.5 * $Lz) / $Lz}]
}

(除了一些不寻常的情况,通常建议你表达得更清楚。所以我也做了那个改变,虽然这不是绝对必要的。)