我在Tcl中有一个文件,我想单独读取每个值作为数组...我认识这样的文件
PUx(1) 1 2 3 4 5 PUx(2) 1 2 3 4 5 PUx(3) 1 2 3 4 5 PUx(4) 1 2 3 4 5 PUx(5) 1 2 3 4 5
所以,我想逐个得到PUx(1)的值并将其添加到变量中。
答案 0 :(得分:0)
正如Donal所指出的,这一切都取决于实际的格式。但如果示例数据具有代表性,这可能对您有用:
set content {PUx(1) 1 2 3 4 5
PUx(2) 1 2 3 4 5
PUx(3) 1 2 3 4 5
PUx(4) 1 2 3 4 5
PUx(5) 1 2 3 4 5}
foreach line [split $content \n] {
set values [lassign $line varName]
set $varName $values
}
parray PUx
lassign
假定行方式数据表示有效的Tcl列表。这可能是也可能不是你的情况。
更新
您可能希望重新组织数据集,这将允许您使用Tcl数组习惯用法来访问"行"和"列"数据的直接方式,或多或少:
set content {PUx(1,1) 1
PUx(1,2) 2
PUx(1,3) 3
PUx(1,4) 4
PUx(1,5) 5
PUx(2,1) 1
PUx(2,2) 2
PUx(2,3) 3
PUx(2,4) 4
PUx(2,5) 5}
foreach line [split $content \n] {
set values [lassign $line varName]
set $varName $values
}
parray PUx
# first column: *,1
foreach {k v} [array get PUx *,1] {
puts $v
}
# first row: 1,*
foreach {k v} [array get PUx 1,*] {
puts $v
}
答案 1 :(得分:0)
如果您主要关心的是如何计算元素列表中的总和,则可以使用以下三个选项:
proc lsum1 {x} {
set r 0
foreach i $x {
incr r $i
}
return $r
}
proc lsum2 {x} {
expr [join $x " + "]
}
proc lsum3 {x} {
::tcl::mathop::+ {*}$x
}
set x {1 2 3 4 5}
lsum1 $x
lsum2 $x
lsum3 $x
lsum1
和lsum3
更可取。 lsum2
是您所描述的"问题"的文化翻译,至少在我的阅读中。您可能还想查看Tcl wiki。它为您提供了lsum3
的详细信息。
这可以很容易地与阅读数据集成,如我的第一个答案所示:
lsum1 $PUx(1)
lsum3 $PUx(1)