2012-04-15 76 views
6

我需要一些幫助來定義數組,並在TCL中顯示和循環它們。定義和循環數組tcl

這是我將如何在PHP中完成它們。

$date =array(); 
$size=0; 
$date[$size] =$pre_event_date; 
/* After doing some manpulation and calculations with $size */ 
for($i=0;$i<=$size;$i++){ 
    echo $date[$i]; 
} 

我想用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 array(); 

所以我編輯使用RSeeger的數組實現我的代碼嘗試一個簡單的測試:

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

上述犯規返回任何有可能是一些錯誤。 我也試過: 把$ date($ key)不加引號,但是也不起作用。

+2

你會從[Tcl的教程]受益(http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) – 2012-04-15 21:27:52

+1

你最後的代碼段的問題是,它缺乏'[數組名稱日期]'和'{'之間的空格。 Tcl中的這個空間是**重要的**!它從腳本中分離出正在迭代的東西(序列化數組內容)併爲每次迭代執行。一般來說,在Tcl中,你必須恰當地分開你的話語;它迅速成爲第二性質(我現在也傾向於在其他語言中做同樣的事情,因爲額外的空白幾乎可以在任何地方提高可讀性,只要它在語義上合法)。 – 2012-04-16 06:48:19

回答

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,這是鍵 - 值>的HashMap中。

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 2012-04-15 21:27:35

+0

沒關係..它的工作..再次感謝所有! – Micheal 2012-04-15 22:33:00

+0

我仍然認爲你最好使用列表而不是數組。 – RHSeeger 2012-04-15 23:02:17

5

在Tcl中,數組的概念與許多其他編程語言不同,Tcl調用數組的地方通常稱爲哈希映射或其他地方的關聯數組。數組索引不限於整數,但可以是任何合法的字符串。大多數情況下,我發現自己使用列表(或列表列表)而不是數組進行數據操作。爲了遍歷整個列表或數組,您可以使用foreach命令。

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

您不必在設置數組之前初始化數組,只需開始添加成員即可。獨立的數組成員作爲

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

引用有Tcl中沒有多維數組,但他們可以通過具有一致的鍵名進行模擬,例如

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

除此之外,我只想指向大多數優秀的Tcl維基,並且它的語法問題爲array pagearray man page,因爲我沒有看到重點在此處重複其大部分內容。

+1

您可以通過嵌套列表來執行多維結構; 'lindex'和'lset'具有多種索引形式,專門用於這種情況。對於你需要這種事情的情況,它運作良好(而且速度也很快)。 – 2012-04-16 06:42:58

3

TCL數組更接近Python調用字典和Perl中的哈希值。 所以它有助於認爲指數爲KeyString中,而不是指數的整數:

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

可以使用array功能做有用的事情,比如生成一個列表中的所有鍵 ,你可以遍歷通過該列表,如果你需要。例如,您可以生成一個密鑰列表,然後使用llength來獲取數組大小。

如果你需要一個獨特的索引來找到它們,這個效果最好。 如果您只需要一個有序列表 - 比使用lappend等實際列表功能更好。

+0

所以我想我會以與我上面編寫代碼的方式稍微不同的方式做到這一點。 – Micheal 2012-04-15 20:28:56

+0

正如Edu提到的 - foreach非常適合使用列表,它有可能使您的生活更輕鬆如果列表適合解決您的問題。 – 2012-04-15 20:30:36

+0

以及在這種情況下,我需要類似於上面提到的代碼的數組..我沒有看到列表適合我在我目前的情況.. – Micheal 2012-04-15 20:36:52