2012-04-15 5 views
6

配列を定義し、それらをTCLに表示したりループしたりするのに助けが必要です。配列を定義してループするtcl

ここで私はそれらをPHPでやるでしょう。

私はtclで同じことをしたいと思います。次のコードは適切ですか?

set size 0 
set date[$size] $pre_event_date 
#After performing some manipulation 
for {set i 0} { $i <=$size } {incr i} { 
    puts "$date[$i]"; 
} 

また、配列としてset $ dateを定義することもできます。などのようないくつか:

set date array(); 

だから私は私のコードはRSeegerの配列の実装を使用して簡単なテストを試してみました、編集:

set date(0) 35 
set date(1) 40 
foreach key [array names date]{ 
    puts "${key}=$date($key)" 
} 

上記のdoesntは、いくつかのエラーは、おそらくそこにあるものを返します。 私も試しました: $ date($ key)を引用符なしで入れますが、それでも問題はありません。

+2

あなたは、最後のコードスニペットと –

+1

問題はそれが欠けているということである[Tclのチュートリアル](http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html)の恩恵を受けるだろう'[配列名の日付]'と '{'の間のスペース。そのスペースはTclでは**重要**です!これは反復されているもの(シリアライズされた配列の内容)をスクリプトから分離して、繰り返しごとに実行します。一般的には、Tclではあなたの単語を適切に区切らなければなりません。それはすぐに第2の性質になります(そして、私は他の多くの言語でも同じことをやろうとします、それは意味的に合法的であれば余分な空白がほとんどどこでも読みやすさを向上させるからです)。 –

答えて

8

(コードが暗示している)数字で索引付けする場合は、listを使用します。これはCの配列に似ています。

set mylist {} 
lappend mylist a 
lappend mylist b 
lappend mylist c 
lappend mylist d 
foreach elem $mylist { 
    puts $elem 
} 
// or if you really want to use for 
for {set i 0} {$i < [length $mylist]} {incr i} { 
    puts "${i}=[lindex $mylist $i]" 
} 

あなたは文字列で、インデックスのものにしたい(またはスパースリストを持っている)場合は、キー - >値のハッシュマップである、arrayを使用することができます。

set myarr(chicken) animal 
set myarr(cows) animal 
set myarr(rock) mineral 
set myarr(pea) vegetable 

foreach key [array names myarr] { 
    puts "${key}=$myarr($key)" 
} 
+0

ありがとう@RHSeeger。私はあなたの方法の一つを試しましたが、それは働きません。 – Micheal

+0

上の私の編集を参照してください..その作業..すべてのおかげで再び! – Micheal

+0

私はまだあなたがリストではなく配列を使うほうが良いと思います。 – RHSeeger

5

Tclでは、配列の概念は他の多くのプログラミング言語とは異なり、Tclが配列と呼ぶものは、しばしばハッシュマップまたは連想配列と呼ばれます。配列インデックスは整数に限定されず、正当な文字列でもかまいません。ほとんどの場合、データ操作のために配列の代わりにリスト(またはリストのリスト)を使用しています。リスト全体または配列をループするには、foreachコマンドを使用します。

foreach {index content} [array get date] { 
    put $index: $content 
} 

値を設定する前に配列を初期化する必要はありません。メンバーを追加するだけです。個々の配列メンバーは、私はちょうど、ありますTclのには多次元配列されるものではないが、彼らは一貫性のあるキー名を持つことによってシミュレートすることができ、それ以外に例えば

set a(1,1) 0 
set a(1,2) 1 
... 

$array($key) or $array("abc") 

として参照されていますほとんどの優れたTclウィキを指しています。ほとんどのコンテンツをここで繰り返しているわけではありませんので、構文の問題についてはarray pagearray man pageです。

+1

リストを入れ子にすることで多次元構造を行うことができます。 'lindex'と' lset'は、この場合専用のマルチインデックス形式です。あなたがそのようなものが必要な場合、それはうまくいく(そして速すぎる)。 –

3

TCL配列はPythonがdictと呼ぶものに近く、Perlではハッシュに近いものです。 だから、むしろインデックス整数よりも、キー文字列としてインデックスを考えるのに役立ちます:

set groceries(fruit) "banana" 
set groceries(1) "banana" 

すべてのキーのリスト を生成するようにあなたは、有益なことを行うarray機能を使用することができますし、あなたが反復することができますあなたが必要ならば、そのリストを通して。 たとえば、キーのリストを生成し、llengthを使用して配列サイズを取得できます。

これは、一意のインデックスが必要な場合に最適です。 オーダーリストが必要な場合は、lappendのような実際のリスト機能を使用する方がよい場合があります。

+0

だから私は私のコードを書いたやり方とは少し違ったやり方でやっていると思います。 – Micheal

+0

Eduが言及したように - foreachは本当にリストを使ってうまくいきます。あなたの人生を楽にする良いチャンスがありますリストがあなたの問題を解決するのに適しているかどうか。 –

+0

この場合、よく私は上記のコードに似た配列が必要です。私の現在の状況で私に合ったリストは表示されません。 – Micheal

関連する問題