TCL;使用foreach命令保存多个列表

时间:2016-03-11 21:19:43

标签: list for-loop foreach tcl

我执行以下操作:

set q [list Phi1 Phi2 Phi3 Phi4 Phi5 Phi6 Phi7 Phi8 Phi9 Phi10 Phi11 Phi12 Phi13 Phi14 Phi15 Phi16 Phi17 Phi18 Phi19 Phi20 Phi21 Phi22 Phi23 Phi24 Phi25 Phi26 Phi27]

然后我定义了我的列表(从Phi1到Phi27)

foreach l $q {
    for {set i 5} {$i<17} {incr i 1} {
        set fx1 [nodeEigenvector $i 1 1]
        set fy1 [nodeEigenvector $i 1 2]
        set frot1 [nodeEigenvector $i 1 3]
        lappend $l [list $fx1]
        lappend $l [list $fy1]
        lappend $l [list $frot1]
    }
}

然后我想将这些矢量保存到一个文件中:

foreach aer $q {
    for {set re 1} {$re<27} {incr re 1} {
        set Mode $aer
        set fo [open Modd.out a]    
        puts $fo [list get $Mode]
        puts [list get $aer]
        close $fo
    }
}

这不起作用。我得到一个带有“获得Phi1”(27次......)列表的文件到Phi27 ...... 有趣的是,当我输入命令puts [list get $Phi1]时,我确实在屏幕上获得了预期的数据。有人可以帮帮我吗? 如果有更简单的方法,我也想知道! (我只是想构建,填充,然后保存矩阵(27向量))。

1 个答案:

答案 0 :(得分:1)

没有list get命令。 您可以通过[set $aer]获取列表的值。

[set varname]会返回varname的值,因此如果aer设置为Phi1[set $aer]将返回Phi1的值。

每次打开和关闭文件都是非常低效的,所以我也解决了这个问题。

所以最后一个循环成为:

set fo [open Modd.out a] ; # or mode w    
foreach aer $q {
   puts $fo [set $aer]
   puts [set $aer]
}
close $fo

您可以重写此内容以使用dict命令。

set phi [dict create]
foreach l $q {
    for {set i 5} {$i<17} {incr i 1} {
        set fx1 [nodeEigenvector $i 1 1]
        set fy1 [nodeEigenvector $i 1 2]
        set frot1 [nodeEigenvector $i 1 3]
        dict lappend phi $l [list $fx1 $fy1 $frot1]
        # or another way:
        # dict lappend phi $l $fx1 $fy1 $frot1
    }
}

puts $phi
puts [dict get $phi Phi2]

字典可以根据方式以不同方式构建 你需要访问你的矩阵。