2017-12-14 39 views
0

配列が存在するかどうかを確認することができません。配列名は変数にあります。私の場合、配列名にもスペースが含まれています。TCL:配列名が変数でも配列の情報を確認する方法

code snippet: 
array set a\ b{ 
    key1 "val1" 
} 

proc checkArr {name} 
{ 
    if {![info exists $name($key)]} { 
     return {} 
    } 
} 

checkArr "a b" 

エラー:は "名前(KEY1)" を読み取ることができません。誰もが変数が配列

ないのを助けることはできますか?

+0

あなたが提供されたサンプルは、あなたが述べている問題以外にも多くの問題があります。再現可能なコードスニペットを入力してください。 – Jerry

+0

@Jerryにお問い合わせいただきありがとうございます。配列名が変数でスペースがある場合、情報が存在するだけで助けが必要です。親切にお手伝いします – Stuti

+0

重複:https://stackoverflow.com/questions/44605149/tcl-how-to-name-a-variable-that-includes-another-variable?rq=1 et。 al。 –

答えて

2

コードの主な問題は、配列がグローバルスコープ内に存在するときに配列がローカルスコープに存在するかどうかを確認しようとしていることです。

array set a\ b { 
    key1 "val1" 
} 

proc checkArr {name} { 
    upvar $name arr 
    if {![info exists arr(key1)]} { 
    return 0 
    } else { 
    return 1 
    } 
} 

PROCのローカルスコープ内でアクセス可能な配列を有するために、使用するかglobal $name又はupvar $name arr(Iは、上記後者の使用)info exist一部を実行するとき、またはあなたがuplevelを使用することができます。

私がコードに行わいくつかの他の調整:

  • 追加スペースarray set一部に、そうでなければ、
  • 関数にパラメータを1つだけ供給しているがarr(key1)$name($key)を変更しました。 を使用すると、$name($key)の値が 'value'だった場合、info existsvalueという名前の変数が存在するかどうかを調べようとしますが、$name($key)を使用すると、その変数の値の変数名を見つけようとします。配列の値$name($key)が存在しないため、エラーが発生します)。

    proc checkArr name { 
        uplevel #0 [list info exists $name] 
    } 
    
    % checkArr "a b" 
    0 
    

    引数として"a b"を与えられたこのコマンドは、スクリプトを実行しinfo exists {a b}はなく、コマンド内のローカルレベルで:

+2

'if ... return ... else return ...'がより読みやすくなるかもしれません: 'return [info exists arr(key1)]' –

+0

はい、私はそれを 'if ... else .. .'形式の場合、OPは後でその構造体を使用して別のものを返すでしょう。見た目からは、元のコードのかなりの部分を削除して、Q形式に適したものを表示する必要がありましたが、プロセスでエラーが発生しました。 – Jerry

0

のは、グローバル配列の存在を確認するためのコマンドを作成してみましょう。 :uplevel #0の部分は、スクリプトがグローバルレベルで実行されることを意味します。

は、今、私たちは、配列を作成し、それを確認してください。

% array set a\ b {key1 val1} 
% checkArr "a b" 
1 

それが存在しています。私たちは同じコード使用して、配列のメンバーの存在を確認するもできます。実際には

% checkArr "a b(key1)" 
1 

を、文字列のいずれかの種類がcheckArrに渡すことができ、変数がある場合、それはあなたを教えてくれます(配列やそれ以外)その名前で。あなたは、アレイのメンバーのための専門チェッカーをしたい場合は、次のように書くことができます。

proc checkArrayMember {arrName memberName} { 
    uplevel #0 [list info exists $arrName\($memberName)] 
} 

% checkArrayMember "a b" key1 
1 

左括弧の前にバックスラッシュは文字列の一部だけその構文上の意味を奪い、それを作る:基本的にスクリプトをinfo exists {a b(key1)}になります。

ドキュメント: arrayinfolistprocuplevelSummary of Tcl language syntax

関連する問題