문제는 TCL 배열에 관한 것입니다. 내 TCL 스크립트에서
variable1
는 다른 함수에서 얻은 변수값(.와 유사한 값 PATH_xyz
)입니다.
variable2
는 와 유사한 값을 가진 다른 계산에서 얻은 또 다른 변수입니다 {3.5400 7.3200}
.
나는 원해요:
set ${variable1}(modifyPt) {variable2}
puts ${variable1}(modifyPt)
옳은 일은 무엇입니까?
나는 노력했다
set ${variable1}(modifyPt) $variable2
출력 >>>:4379.2160 13892.8270
puts ${variable1}(modifyPt)
출력 >>>:PATH_62_5474(modifyPt)
(실행 시간에 저장됨 PATH_62_5474
) 위의 두 번째 출력에 있는 예상 값입니다. 나도 시도했다variable1
PATH_62_5474(modifyPt)
4379.2160 13892.8270
puts ${${xysp}(modifyPt)}
출력 >>>:Error: can't read "${variable1": no such variable
답변1
동적 변수 이름을 사용하지 않는 것이 좋습니다. 단순하게 유지하기 위해 "복합" 배열 키를 만들 수 있습니다.
# setup
set variable1 PATH_xyz
set variable2 {3.5400 7.3200}
# store the data in an array named "data"
set data($variable1,modifyPt) $variable2
# extracting it
% puts $data($variable1,modifyPt) ; # => 3.5400 7.3200
# print the array contents
parray data ; # => data(PATH_xyz,modifyPt) = 3.5400 7.3200
너할 수 있는동적 변수 이름이 있는 사전을 사용하지만 사전에서 데이터를 추출하는 것은 약간 이상해 보입니다.
# store an empty dictionary in the variable "PATH_xyz"
set $variable1 [dict create]
# `dict set` takes a variable *name*
dict set $variable1 modifyPt $variable2
# `dict get` takes a variable *value*
dict get [set $variable1] modifyPt ; # => 3.5400 7.3200
비슷한 방식으로 배열을 똑같이 어색한 방식으로 사용할 수 있습니다.
array set $variable1 [list modifyPt $variable2]
parray $variable1 ; # => PATH_xyz(modifyPt) = 3.5400 7.3200
puts [set ${variable1}(modifyPt)] ; # => 3.5400 7.3200
아니면 진짜 무섭다
puts [subst -nobackslashes -nocommands $${variable1}(modifyPt)]
답변2
무슨 뜻인지 잘 모르겠지만, 다음은 tcl에서 배열 요소를 간접적으로 참조하는 방법에 대한 몇 가지 예입니다.
% set array(key1) {value 1}
value 1
% set aname array
array
% set ${aname}(key2) {value 2}
value 2
% array get ${aname}
key {some value} key1 {value 1} key2 {value 2}
% set ${aname}(key2)
value 2
% set key key2
key2
% puts "<[set ${aname}($key)]>"
<value 2>
set
귀하의 예에서는 대신 사용할 수 있습니다 puts
.
% set variable2 {3.5400 7.3200}
3.5400 7.3200
% set variable1 PATH_xyz
PATH_xyz
% set ${variable1}(modifyPt) $variable2
3.5400 7.3200
% set ${variable1}(modifyPt)
3.5400 7.3200
위와 마찬가지로 [...]
명령 대체에 사용할 수 있습니다.
% puts "${variable1}\(modifyPt)={[set ${variable1}(modifyPt)]}"
PATH_xyz(modifyPt)={3.5400 7.3200}