4

info globals コマンドに含まれるすべての変数と値を一覧表示する小さなコードを作成しようとしています。置換を何度か繰り返してみましたが、Tcl で変数名を変数として扱い、その値を返すことができません。以下は私が始めたものです:

set fileid [open "c:/tcl variables.txt" w+]
foreach {x}  [lsort [info globals]]  {
    set y $x
    puts $fileid "$x  $y   "
}

私は得ることができます

DEG2RAD DEG2RAD   
ぴぴぴ   
RAD2DEG RAD2DEG   
.....

また

DEG2RAD $DEG2RAD   
PI $PI   
RAD2DEG $RAD2DEG   
.....

しかし、私が必要なのは

DEG2RAD 0.017453292519943295   
PI 3.1415926535897931   
RAD2DEG 57.295779513082323   
....   
4

3 に答える 3

6

私はあなたがsubstコマンドを探していると思います:

set fileid [open "c:/tcl variables.txt" w+] 
foreach {x} [lsort [info globals]] {
  puts $fileid "$x [subst $$x] " 
}

または、setが設定されている値を返すという事実を利用することもできます。

set fileid [open "c:/tcl variables.txt" w+] 
foreach {x} [lsort [info globals]] {
  puts $fileid "$x [set $x] " 
}
于 2012-05-18T01:28:06.997 に答える
4

これを行う最も簡単な方法は (出力に一時変数が散らばるのを避けるため)、ヘルパー プロシージャと次のupvarコマンドを使用することです。

proc listAllGlobals {filename} {
    set fileid [open $filename w+]
    foreach varname [lsort [info globals]] {
        upvar "#0" $varname var
        if {[array exists var]} continue;    # Skip global arrays...
        puts $fileid "$varname $var "
    }
    close $fileid
}
listAllGlobals "C:/tcl variables.txt"

Tcl 8.5 を使用している場合は、プロシージャを作成せずにこれを実行できます。

apply {{} {
    set fileid [open "C:/tcl variables.txt" w+]
    foreach varname [lsort [info globals]] {
        upvar "#0" $varname var
        if {[array exists var]} continue;    # Skip global arrays...
        puts $fileid "$varname $var "
    }
    close $fileid
}}

upvarローカル変数を別のスタック フレームの変数にリンクするため、これはすべて機能します。#0はグローバル スタック フレーム$varnameの名前、 はそのコンテキスト内の変数の名前、 はvarバインド先のローカル変数です。

于 2012-05-18T18:19:33.870 に答える