TCL 스크립트에서 변수를 배열 이름(배열)으로 사용

TCL 스크립트에서 변수를 배열 이름(배열)으로 사용

문제는 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) 위의 두 번째 출력에 있는 예상 값입니다. 나도 시도했다variable1PATH_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}

관련 정보