배열 이름에 숫자 접미사가 있는 TCL의 배열 반복

배열 이름에 숫자 접미사가 있는 TCL의 배열 반복

TCL에는 다음과 같이 이름에 숫자 접미사(즉, 이름이 숫자로 끝나는)가 있는 배열이 있습니다.

array set ps0 [ list 0 15.885 1 55.43 1 0.254 2 0.227 3 0.177 ]
array set ps1 [ list 0  6.585 1 56.43 1 0.254 2 0.227 3 0.177 ] 
array set ps2 [ list 0 32.485 1 43.13 1 0.254 2 0.227 3 0.177 ] 

TCL에서 이를 반복하고 값을 가져와야 하지만 숫자 접미사를 이스케이프 처리하기 위해 무엇을 하든 배열과 내용을 모두 가져올 수 없습니다. 예를 들어 내가 시도한 모든 것:

ps$i($i)
"ps$i($i)"

또는 유사한 컬렉션을 사용할 수도 있습니다.

set p ps$i

...숫자 인덱스가 있는 배열을 가져올 수 없습니다. 오류가 발생합니다.

Original error: can't read "ps": no such variable

...가능한 모든 조합. TCL에서 이 작업을 어떻게 수행할 수 있나요?

답변1

런타임에 변수 이름을 생성하려고 할 때마다 이는 잘못하고 있다는 큰 신호이므로 사용해야 합니다.dict그 반대입니다(일반적으로 배열보다 사용하기 쉽습니다). 이 경우 다차원 사전은 다음과 같습니다.

dict set ps 0 [dict create 0 15.885 1 55.43 1 0.254 2 0.227 3 0.177]
dict set ps 1 [dict create 0 6.585 1 56.43 1 0.254 2 0.227 3 0.177]
dict set ps 2 [dict create 0 32.485 1 43.13 1 0.254 2 0.227 3 0.177]

puts [dict get $ps 1 0] ;# 6.585
dict set ps 1 0 3.14159 ;# Change it to pi

# Print out all the key-value pairs in the ps dict associated with 0
dict for {k v} [dict get $ps 0] {
    puts "$k\t$v"
}

이것문서변수 대체의 경우 $name(index):

이름배열 변수의 이름을 제공하고색인이 배열의 요소 이름을 제공합니다.이름문자, 숫자, 밑줄 및 네임스페이스 구분 기호만 포함할 수 있으며 빈 문자열일 수 있습니다. 문자와 숫자는 표준 ASCII 문자입니다(0~9,AZ그리고아즈)

이것이 바로 그런 것이 작동하지 않는 이유 중 하나입니다. ps$i($i)이름에서 변수 대체가 수행되지 않습니다. 이 예에서는 i이름이 뭐든지인 배열 변수를 찾고 있습니다 .

답변2

dicts가 분명히 더 나은 선택입니다.

배열을 사용하여 이를 수행하는 방법이 있습니다. 사용upvar동적 이름을 "임시" 이름에 연결

foreach i {0 1 2} {
    puts "ps$i"
    upvar 0 ps$i tmp
    parray tmp
}
ps0
tmp(0) = 15.885
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177
ps1
tmp(0) = 6.585
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177
ps2
tmp(0) = 32.485
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177

배열 키가 연속된 정수인데 왜 일반 목록을 사용하지 않는지 궁금합니다.

관련 정보