2010-11-21 23 views
0

Tclを使用してIf文の式を評価する方法を理解しようとしています。これは私が持っているものです。Tclを使ってif文で式をtrueに評価する

#!/bin/sh 
#The next line executes wish - wherever it is \ 
exec wish "$0" "[email protected]" 

set apid "/var/run/apache2.pid" 

set apsta [file exist $apid] 

if { $apsta == 1 } 

{ 
    set result ":)" 
} 

else 

{ 
    set result ":(" 
} 

label .status -text $result 
pack .status 

、これは私が端末から得るものです:

# wan27 
Error in startup script: wrong # args: no script following " $apsta == 1 " argument 
    while executing 
"if { $apsta == 1 }" 
    (file "/usr/bin/wan27" line 9) 

Apacheが実行されている場合はApache場合、私はちょうど、出力に悲しいものを幸せな笑顔をしようとしています停止している - ファイルが存在する「/var/run/apache2.pid」かどうかをブール条件に基づいて...

+0

あなたはかなりそれ以外の言語は、ステートメントを終了するので(ただし、独自のインデントルールを選ぶが、私は3つのまたは4のスペースを好む)のTclで唯一の真のブレーススタイルを使用するんです最初の改行で。あなたの唯一の選択肢は、あなたが継続したい行の最後に余分なバックスラッシュを追加することですが、私はそれが残念です*遠く*もっと思う。 (あるいは、コマンド間にセミコロンをつけて長い行に物事を書いてください。醜いですが、中かっこやインデントの問題はありません。) –

+0

これでいいです。通訳者は、if文と同じ行にブレースが来ることを期待していました。私はキーワードが空白で区切られている必要があり、if {}のような評価記号に貼り付けることができなかったことにも気づいた。 – fabjoa

+0

'[ファイルは...]'は真偽の結果を返すので、明示的に結果を1と比較する必要はありません: 'if {$ apsta} {...}' –

答えて

8

のTcl if文の構文は次のとおり

if condition statement else statement 
です

これは1行にする必要があります。中括弧は、行に渡って継続することを許可し、その配置が必須です:あなたはそれが書かれていたよう

if { $apsta == 1 } { 
    set result ":)" 
} else { 
    set result ":(" 
} 

、Tclは

if { $apsta == 1 } 

を見て、構文エラーを生じるが停止します。

+0

+1:これは問題です。 –

+0

その場ですぐに!ありがとうmsw – fabjoa

2

MSWはすでに正しい答えを与えていますが、あなたのコメントに基づいている他の混乱を解消するためにはもう少し説明が必要だと思います。

私はそれがあまり混乱しないと思うので、まず非tcl用語を使って説明します。

tclでは、ifはステートメントではありません。 ifは関数です。これは、開始ブレースが同じ行にある必要がある理由です。改行が関数の引数のリストを終了させるためです。たとえば、次のコードでは:

a b c d 
e f 

Tclインタープリタには2つの関数呼び出しがあります。最初は引数b、c、dを持つaを機能させ、2つ目は単一のargumrnt fを持つeを機能させる。同様に、次のように:

if a 
    b 

Tclは単一の引数を持つ関数ifへの呼び出しを見ています。 ifは少なくとも2つの引数を必要とするので(インタプリタ自体ではない)、間違った引数の数について不平を言ってエラーを投げます。

これは、ifとその最初の引数の間にスペースが必要な理由についても説明します。これは、変数や関数の名前が、文字、スペース、カンマ、NULのような非印字文字を含むほとんどの文字を含むことが文字通り許可されているからです。たとえば、関数を定義することができa{b}呼ば:

proc a{b} {} {puts HA!} 
a{b} ;# <-- prints out HA! 

だから、あなたが行う場合は、何かのように:

if{x} {y} 

Tclは機能if{x}が定義されていないと文句を言うだろう。

ifは、このように機能する唯一のものではありません。Tclにはキーワードはありません。forforeachwhileなどの組み込み関数の標準ライブラリです。すべて同じルールが適用されます。


本当に重要ではない:

、TCLでif関数がCで三項演算子のように動作します:それは値を返します。実際には次の操作を実行できます。

# It is unfortunate that this "give" function is not built in. 
# We use it to return something from if without actually 
# calling return: 
proc give {x} {return $x} 

set something [if {$x} {give "Very true indeed."} {give "Unfortunately false."}]