无法在 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)作为替代。