1
% set HI 1
1
% if { [ info exists HI] && { $HI == 1 } } { puts "Hello World "}
can't use non-numeric string as operand of "&&"
%   

どちらの条件も単独でテストできます。テストの&&をTCLで機能させる方法は?

これだけで動作します

% if  { $HI == 1 }  { puts "Hello World "}
Hello World

そして、これも単独で機能します。

% if { [ info exists HI]  } { puts "Hello World "}
Hello World
4

4 に答える 4

5

余分な中括弧は必要ありません。これは正常に機能するはずです:

if { [info exists HI] && $HI == 1 } { puts "Hello World" }
于 2012-11-08T23:05:28.930 に答える
5

テストの2番目の部分、つまり

{ $HI == 1 }

Tclで中括弧の意味について混乱したと思いますので、間違っています。中括弧と同じで( ... )はありません。評価で使用される優先順位を変更するために数式で使用することはできません。

中括弧は、スペースを含む文字列を構成し、Tclコマンドの単一の引数として表示されるようにするために使用されますが、その内部で置換は実行されません

あなたの場合、$HIは変数の値で置き換えられないHIので、先頭と末尾のスペースを含め、中括弧内に表示されるすべての正確な文字を含む文字列を形成しています。

もし、するなら

if {{ $HI == 1 } eq {$HI == 1}} {
    puts "same"
} else {
    puts "not the same"
}

not the same結果として得られます。(eq式内で文字列比較を実行します。)

二重引用符を文字列の区切り文字として使用する場合も、正しい意味は得られません。

" $HI == 1 "

この場合、変数は実際にはその値に置き換えられるため、直接記述したようになります(コードのように、と仮定$HI1ます)。

" 1 == 1 "

しかし、それは文字列です

なぜTclは文句を言うのですか?それが言うように、あなたはのオペランドとして非数値文字列を使用しようとしていますが、数値として表示する方法がないため数値&&ではありません。そのため、Tclは数値に応じてtrue / false値に変換できません( 0の場合はfalse、0でない場合はtrue)、エラーが発生します。{ $HI == 1 }

あなたが本当に書きたかったのは

if { [ info exists HI] && ( $HI == 1 ) } { puts "Hello World "}
#                         ^          ^
#                         |__________|____ note ( ) instead of { }

==に関してより高い優先順位を与えるため&&、または条件をより明確にするため。exprのテスト条件内で暗黙的に呼び出される、はif、他のプログラミング言語や数学で見られるのと同じ意味を持つ丸括弧について知っています。評価順序を変更します。

他の回答やコメントで指摘されているように、(Cや他の多くの言語と同様に)equal演算子==はブール値や。よりも優先度が高いため、角かっこは必要ありません&&( ... )ただし、必要に応じて、恐れることなく使用できます。

if {2 - 1 * 2} { puts yes } { puts no }

式は0noとして評価されるため、を与えます。2 - (1 * 2)

if {(2 - 1) * 2} { puts yes } { puts no }

は2だからyesです。(2 - 1) * 2

于 2012-11-09T08:51:09.567 に答える
1

[expr $HI == 1]代わりに試してください{ $HI == 1 }

于 2012-11-08T23:05:51.990 に答える
1

Tcl式では、{…<code>}は非置換リテラルを囲みます。$(または、直前にある場合は変数名。)式が内部にある場合、これは次のいずれかを実行する必要があることを示します。

  • {…<code>}を(…<code>);に変更します。括弧は、式の中に通常の数学的解釈があります。
  • {…<code>}を…<code>}]に変更[expr {して、式が実際にそのように解釈されるようにします。

2つのケースのバイトコードは実質的に同一であるため、パフォーマンスの観点からは問題があります。わかりやすい方を書いてください。(私自身、2番目の形式を使用することはほとんどなく、定数でない式のフラグメント[expr]が必要な場合に備えて、式のコンテキストでネストを予約します。これは実際には非常にまれです。)

于 2012-11-09T09:29:34.330 に答える