1

次の問題があります。

set start "input[0]"
set end   "output[0]"
set myArray($start,$end,pin) 1
set x "input[0]"
set y "output[0]"
set test [array names myArray $x,$y,pin]
puts "\n$test"

出力は次のようになります。

input[0],output[0]

しかし、出力は次のとおりです。

{}

私が行った場合:

set test [array names myArray *,*,pin]
puts "\n$test"

出力は次のとおりです。

input[0],output[0]

[]また、{} ie.input{0},output{0} 元のコードに置き換えると動作します。

誰かがここで何が起こっているのか教えてもらえますか? []ブラケットをエスケープするにはどうすればよいですか?

4

1 に答える 1

3

さて、ここで何が起こっているのか見てみましょう:

set start "input[0]"

これにより、コマンドが実行され0ます。それが何をするのかはわかりませんが、おそらくそれは望まないでしょう。ブラケットをエスケープするか、\または使用{}して名前を囲みます。

同じことが当てはまります

set end   "output[0]"
# ...
set x "input[0]"
set y "output[0]"

しかし、あなたはその問題を抱えているようには見えません。

次に、glob パターンを に渡しますarray names

set test [array names myArray $x,$y,pin]

Tcl は[]、正規表現と同様に、文字の選択に in glob パターンを使用します。したがって、パターンは にのみ一致しinput0,output0,pinます。-exactスイッチをarray names次のように渡すことで、これを回避できます。

set test [array names myArray -exact $x,$y,pin]

または、バックスラッシュを使用して括弧を再度エスケープすることもできます ( Tcl がすべての種類の置換を行ったinput\[0\],input\[1\],pin のパターンは次のようになることに注意してください)。

于 2013-12-19T13:19:29.340 に答える