問題は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
)上記の2番目の出力の予想値。私も試しました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}