-1

(上向きのスタックで) upvar を使用して変数を変更しようとしていますが、変数の値は変数名ではなくプロシージャに渡されます。

渡されたものを変更することはできません。これは、プログラムで既に広く実装されているためです。

ファイル名を何らかの方法で変更する方法はありますか?

proc check_file_exists {name} {
   upvar $name newName
   check_exists $name     #Do all checks that file is there
   set newName $name_1
}

check_file_exists $name
puts $name 

このコードは、ファイルの新しい名前ではなく、古い名前を出力します。

4

2 に答える 2

1

あなたがすべきだと思うのは、弾丸を噛んでコールを変更することです. 結局のところ、これはかなり単純な検索と置換です。他のソリューションを使用する場合よりも、コードはより健全になります。

check_file_exists name

または、別のパラメーターをパラメーター リストに追加し、それを使用して名前を渡し、最初の引数を仮引数にすることもできます。

check_file_exists $name name

または、戻り値を使用していない場合は、新しい値を返して代入することができます。

set name [check_file_exists $name]

または、新しい値をtheValueプロシージャ内のグローバル変数 (例: ) に割り当て、それを元に戻すこともできます。

check_file_exists $name
# don't need this if you're in global scope
global theValue
set name $theValue

または、名前をグローバル変数 (例: theName) に割り当てて、プロシージャ内でアクセスすることもできます。プロシージャはname直接更新できます。

# don't need this if you're in global scope
global theName
set theName name
check_file_exists $name

(この fi には、 を使用したいくつかのバリエーションがありますupvar。)

代替手段はどれもきれいではなく、呼び出し時に変更を加える必要があります (この値に 1 つの変数しか使用しない場合は、最後のものを除きます)。info frameそれをしないことに固執している場合は、手順自体を変更するだけで済むDonalのソリューションが常にあります.

これらの代替手段の手順コードについてサポートが必要な場合はお知らせください。

于 2015-08-30T08:55:59.123 に答える