2017-08-01 2 views
0

特定の式を評価しようとしています。私はコマンドで "pqr" & & "xyz"を持っています。コマンドを評価するとき、それはエラーを返す:close-quoteの後の余分な文字。 私は、二重引用符の後に& &を解析することができないと思う。これが理由なら、どうすれば二重引用符を扱わなければならないのですか?& &?TCLエラー:クローズクォート後の余分な文字

+1

あなたはエラーになり、実際のコードを表示することができますか? "pqr"と "xyz"はブール値ではないので、ここに示した内容はあまり意味がありません。したがって、&&で結合することはできません。 –

答えて

0

あなたには十分な情報がありません。

expr "pqr"&& "xyz" 

「クローズ引用符の後に余分な文字」というエラーメッセージを与えて行います。

野生の推測では、あなたがこのような何かを書いていたということです。これは、インタプリタがTcl言語の規則に従ってコマンドを解析しようとするためであり、これらの規則の1つは、二重引用符で始まる単語が一致する二重引用符で終わらなければならないということです。この場合、一致する二重引用符の後に2つの&文字があります。

は今、(二重引用符とアンパサンドの間のスペースを持つ)

expr "pqr" && "xyz" 

は、どちらかは良いではありません。これは、インタープリターが、コマンドの引数を準備するときに構文的な機能を持つ文字を削除するためです。これは、引数exprが文字列pqr && xyzであることを意味します。 exprコマンドが実行されると、その引数は、 Tclではない特別な表現言語の文字列として解釈しようとします。特に、ブール値ではないTcl文字列や関数の変数名は、中括弧または二重引用符で囲む必要があります(例:"pqr" && "xyz")。どうやってそれを手に入れますか?あなたはいつも引数をexprに括っています。そうです。

expr {"pqr" && "xyz"} 

exprが法的文字列"pqr" && "xyz"を取得することを意味します。

は、しかしストリング"pqr" && "xyz"は、そうexpr {"true" && "false"}

ように、&&(論理AND)演算がブール値の文字列表現に等しい文字列以外の文字列に対して定義されていないため、まだ有効ではありませんもう一度私たちは立ち往生しています。あなたがしているように見えるものは意味をなさないからです。あなたがしていることを私たちに示すなら、私たちはあなたを助けることができるかもしれません。

*)です。まれな、熟練したレベル。

ドキュメント: exprMathematical operators as Tcl commandsSummary of Tcl language syntax

ブレースあなたの表現

に同じメカニズムを使用しexprコマンド(ひいては、コマンドforif、およびwhile、それらの条件を評価する)は、引数から構成された式文字列を解釈します。式文字列の言語はTclのではないことに注意してください、しかしexprコマンドの式の評価に固有:言語は、多くの構文形式を共有しますが、expr言語とプレフィックスの中置、オペレータベースの構造に根本的に異なっている、コマンドベースTclの構造。 Tclインタプリタをまかせ

は、SQLインジェクション攻撃と同様のセキュリティ上の問題がある

  1. 二重置換、につながることができexprに渡す前に引数を評価します。
  2. 反復コマンド(forwhile)無限ループにつながる、一定の値の条件の引数を取得。 exprが選択それらの一部を抑制することができるが(したがって、その副作用)
  3. すべての置換が常に生じます。

したがって、ないはTclインタプリタによって評価されるブレース(エスケープ)文字列、唯一expr通訳として表現文字列を提供するために、ほとんど常により良いです。

exprの引き数を無効にすることは、引数評価がそれらを有効なものに変換する限り、無効な式ストリングであることが許されていますが、中括弧はそのまま有効でなければなりません(例えば、変数またはコマンドの置換は単純オペランド演算子や複雑な式ではありません)。それから - (10倍高速5)

ブレース表現文字列を使用してからのもう一つの利点は、通常、バイトコンパイラがより効率的なコードを生成することができるということです。

関連する問題