无法在 tcl 循环中获取数组信息
Unable to get the array information in tcl loop
我无法在下面的 foreach 循环中打印所需的变量 1 和 2 值。我正在获取变量的名称。
#A_voltages has 1
#B_voltages has 2
#port_1 has A
#port_2 has B
foreach v1 $port_1\_voltages {
foreach v2 $port_2\_voltages {
puts "-D3- v1=$v1= v2=$v2="
}
}
预期结果:
-D3- v1=1 v2=2
当前结果:
-D3- v1=A_voltages v2=B_voltages
您可能需要使用“数组获取”,如
#! /usr/bin/tclsh
set A_rray(0) "X"
set A_rray(1) "Y"
set A_rray(2) "Z"
set B_rray(0) "A"
set B_rray(1) "B"
set B_rray(2) "C"
set B_rray(3) "D"
foreach L { "A" "B" } {
puts $L
foreach {akey aval} [array get $L\_rray ] {
puts "$L $aval ($akey)"
}
}
这给出了
A
A X (0)
A Y (1)
A Z (2)
B
B A (0)
B B (1)
B C (2)
B D (3)
我不确定你为什么要尝试使用嵌套循环,或者如果你的变量每个都有一个值,那么根本就没有循环,但诀窍是建立一个变量名并将它传递给 set
.
示例 tclsh
REPL 会话:
% set A_voltages 1
1
% set B_voltages 2
2
% set port_1 A
A
% set port_2 B
B
% puts "-D3 -v1=[set ${port_1}_voltages]= =[set ${port_2}_voltages]="
-D3 -v1=1= =2=
注意使用 ${name}
将其与字符串的其余部分区分开来。
对于这种事情,在过程中使用 upvar
通常是最容易的。这使您可以在过程期间为变量提供易于使用的名称。 (使用 #0
而不是 1
来获取全局名称,或者使用 namespace upvar ::
而不是 upvar
。)
proc iterOver {port_1 port_2} {
upvar 1 ${port_1}_voltages p1v ${port_2}_voltages p2v
foreach v1 $p1v {
foreach v2 $p2v {
puts "-D3- v1=$v1= v2=$v2="
}
}
}
iterOver A B
对于一次性代码,可以使用 lambda(apply
)作为替代。
我无法在下面的 foreach 循环中打印所需的变量 1 和 2 值。我正在获取变量的名称。
#A_voltages has 1
#B_voltages has 2
#port_1 has A
#port_2 has B
foreach v1 $port_1\_voltages {
foreach v2 $port_2\_voltages {
puts "-D3- v1=$v1= v2=$v2="
}
}
预期结果:
-D3- v1=1 v2=2
当前结果:
-D3- v1=A_voltages v2=B_voltages
您可能需要使用“数组获取”,如
#! /usr/bin/tclsh
set A_rray(0) "X"
set A_rray(1) "Y"
set A_rray(2) "Z"
set B_rray(0) "A"
set B_rray(1) "B"
set B_rray(2) "C"
set B_rray(3) "D"
foreach L { "A" "B" } {
puts $L
foreach {akey aval} [array get $L\_rray ] {
puts "$L $aval ($akey)"
}
}
这给出了
A
A X (0)
A Y (1)
A Z (2)
B
B A (0)
B B (1)
B C (2)
B D (3)
我不确定你为什么要尝试使用嵌套循环,或者如果你的变量每个都有一个值,那么根本就没有循环,但诀窍是建立一个变量名并将它传递给 set
.
示例 tclsh
REPL 会话:
% set A_voltages 1
1
% set B_voltages 2
2
% set port_1 A
A
% set port_2 B
B
% puts "-D3 -v1=[set ${port_1}_voltages]= =[set ${port_2}_voltages]="
-D3 -v1=1= =2=
注意使用 ${name}
将其与字符串的其余部分区分开来。
对于这种事情,在过程中使用 upvar
通常是最容易的。这使您可以在过程期间为变量提供易于使用的名称。 (使用 #0
而不是 1
来获取全局名称,或者使用 namespace upvar ::
而不是 upvar
。)
proc iterOver {port_1 port_2} {
upvar 1 ${port_1}_voltages p1v ${port_2}_voltages p2v
foreach v1 $p1v {
foreach v2 $p2v {
puts "-D3- v1=$v1= v2=$v2="
}
}
}
iterOver A B
对于一次性代码,可以使用 lambda(apply
)作为替代。