2016-07-28 7 views
1

をエスケープしている理由私はTCL 8.6の次の実験でした:TCL式の解析 - ブレースとブラケットが異なっ

% expr \"\{" ne \"x\" 
1 

% expr \"\[" ne \"x\" 
extra characters after close-quote 
in expression ""[" ne "x"" 

最初のコマンドは、私には理にかなって:

  1. 引数がないので最初のラウンド解析はスクリプトレベルの解析であり、バックスラッシュエスケープは削除されます。expr "{" ne "x"
  2. exprコマンドは解析を続け、 "{"と "x"は2つの引用符で囲まれたリテラルであり、

2番目のコマンドのエラーは意味をなさないものです。唯一の違いは、ブラケットをブレースで置き換えることです。なぜ失敗しますか?

私は、引数の補足が期待されていることを知っていますが、この質問は主にTCL解析を理解することです。

+0

コマンドが解析される方法は、Tclはexprコマンドに渡す文字列引数を探します。あなたの文字列引数\ "\ ["は\ [文字の後に文字列を始めるが、その文字列は閉じた二重引用符で終わらないように見える。 – MoDJ

答えて

1

第2のコマンドの問題点は、exprコマンドが ... ]のコマンドシーケンスをコマンド置換として二重引用符で囲んでいることです。 これは、Tclがかどうかとは無関係で、全体の表現を常に補うことが本当に良いアイデアの理由の一部です。代わりにあなたが使用していた場合:

expr \{\[\} ne \"x\" 

それはうまくいきました。基本Tcl言語と同じように、exprは、コマンド置換をブレースクォートで展開しません。

関連する問題