これが私がやろうとしていることの例です。
set t SNS
set ${t}_top [commands that return value]
${t}_topに保存されている情報を取得したい
puts “${t}_top”
SNS_top (really want the data stored there?)
$ {{$ t} _top}だったと思いますが、おそらくそれはperlでしたが、{}内の{}は機能しません。
これが私がやろうとしていることの例です。
set t SNS
set ${t}_top [commands that return value]
${t}_topに保存されている情報を取得したい
puts “${t}_top”
SNS_top (really want the data stored there?)
$ {{$ t} _top}だったと思いますが、おそらくそれはperlでしたが、{}内の{}は機能しません。
Tcl の非常に興味深い点の 1 つは、投稿した質問で行っているように、変数名を動的に作成できることです。ただし、これにより、記述が難しくなり、コードを理解するのが必要以上に難しくなります。
${{$t}_top} と同等の処理を行う方法を見つけようとする代わりに、問題を完全に回避する方が間違いなく優れています。これは、連想配列を使用して行うことができます。
たとえば、これの代わりに:
set t SNS
set ${t}_top [commands that return value]
...
puts [set ${t}_top]
これを行う:
set t SNS
set top($t) [commands that return value]
...
puts $top($t)
ほとんどの人は、後者の例の方がはるかに読みやすいことに同意します。
試す
puts [set ${t}_top]
Tcl のコードの各行は、置換フェーズ (変数、コマンドなどが置換される) を 1 回だけ実行されます... 通常は。そのため、次のようなもの
set var1 1
set var2 var1
set var3 $$var2
代入子が「$$var2」を「'$var2' という名前の変数の値 (文字通り)」に置き換えて停止するため、var3 が 1 になることはありません。
物事を別の方法で進めるか、別のラウンドの代替を強制するために必要なもの。もう 1 つの方法は、通常、2 回目の置換を必要としないようにすることです (Jackson が示すように)。
set var3 [set $var2]
ここで、$var2 は、置換中に「var1」に置き換えられます...その後、[set var1] は 1 を返します...次に、var3 は値「1」に設定されます...そして、あなたは良いです。
構文
puts [expr $${t}_top]
同様に機能し、「設定」操作の使用を回避するため、構文エラーによってデータが上書きされることはありません。