Saya tidak dapat mencetak nilai variabel 1 dan 2 yang diinginkan dalam loop foreach di bawah ini. Saya mendapatkan nama variabel sebagai gantinya.

#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="
    }
}

HASIL YANG DIHARAPKAN:

-D3- v1=1 v2=2

HASIL SAAT INI:

-D3- v1=A_voltages v2=B_voltages
tcl
0
Alan Saldanha 28 Desember 2020, 12:44

3 jawaban

Jawaban Terbaik

Saya tidak yakin mengapa Anda mencoba menggunakan loop bersarang, atau loop sama sekali jika variabel Anda masing-masing memiliki nilai tunggal, tetapi triknya adalah membuat nama variabel dan meneruskannya ke set.

Contoh tclsh sesi 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=

Perhatikan penggunaan ${name} untuk membedakannya dari string lainnya.

0
Shawn 28 Desember 2020, 13:04

Anda mungkin perlu menggunakan "array get", seperti pada

#! /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)"
  }
}

Yang memberikan

A
A X (0)
A Y (1)
A Z (2)
B
B A (0)
B B (1)
B C (2)
B D (3)
0
Gerard H. Pille 28 Desember 2020, 10:10

Seringkali paling mudah menggunakan upvar di dalam prosedur untuk hal semacam ini. Itu memungkinkan Anda memberi variabel nama yang mudah digunakan selama prosedur. (Gunakan #0 sebagai ganti 1 untuk mendapatkan nama global, atau gunakan namespace upvar :: sebagai ganti 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

Untuk kode sekali pakai, lambda dapat digunakan (dengan apply) sebagai alternatif.

0
Donal Fellows 28 Desember 2020, 14:27