2012-04-15 12 views
6

Potrzebuję pomocy w definiowaniu tablic i wyświetlaniu i zapętlaniu ich w TCL.definiowanie i zapętlanie przez tablice tcl

Oto, jak zrobiłbym to w 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]; 
} 

Chciałbym zrobić to samo z tcl. Czy poniższy kod jest odpowiedni?

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

Również można zdefiniować zbiór $ date jako tablicę. Niektórzy lubią jak:

set date array(); 

Więc edytowane mój kod spróbował prosty test z użyciem tablicy RSeeger za realizację:

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

powyższe nie robi nic powrotu nie ma chyba jakiś błąd. Próbowałem również: umieszcza $ date ($ key) bez cudzysłowów, ale to nie działa.

+2

Będziesz korzystać z [Tutorial Tcl] (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) –

+1

Problem z ostatniego fragmentu kodu jest to, że brakuje spacja między '[nazwami nazw tablic]' i '{. Ta przestrzeń jest ** znacząca ** w Tcl! Oddziela on powtarzaną rzecz (spersonalizowaną zawartość tablicy) od skryptu do wykonania dla każdej iteracji. Ogólnie rzecz biorąc, przy Tcl musisz właściwie rozdzielić słowa; szybko staje się drugą naturą (i staram się robić to samo teraz, również w wielu innych językach, ponieważ dodatkowe spacje zwiększają czytelność niemal wszędzie, pod warunkiem, że są semantycznie legalne). –

Odpowiedz

8

Jeśli chcesz indeksować rzeczy według numeru (co sugeruje twój kod), użyj numeru list. Jest to analogiczne do tablicy w 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]" 
} 

Jeśli chcesz indeksu rzeczy przez sznurka (lub posiada rzadki listę), można użyć array, który jest HashMap z kluczykowy wartości >.

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

Dzięki @RHSeeger. Próbowałem jednej z twoich metod, ale to nie działa. zobacz moje edycje powyżej – Micheal

+0

nieważne .. jego działanie ... ponownie wszystko dziękuje! – Micheal

+0

Nadal uważam, że lepiej będzie użyć list, a nie tablic. – RHSeeger

5

W Tcl pojęcie tablicy różni się od wielu innych języków programowania, a to, co Tcl nazywa tablicą, często nazywane jest tablicą asocjacyjną lub tablicą asocjacyjną w innym miejscu. Wskaźniki tablic nie są ograniczone do liczb całkowitych, ale mogą być dowolnymi ciągami prawnymi. Przez większość czasu używam list (lub list list) zamiast tablic do manipulacji danymi. Aby zapętlić całą listę lub tablicę, możesz użyć polecenia foreach.

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

Nie musisz zainicjować tablicę przed ustawieniem to wartości, po prostu rozpocząć dodawanie członków. Poszczególni członkowie array są oznaczone jako

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

Brak wielowymiarowe tablice w Tcl, ale mogą być symulowane poprzez spójne nazwy klawiszy, na przykład

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

Poza tym, ja po prostu wskazuje na znakomitą wiki Tcl i jego problemy z składnią, takie jak array page i array man page, ponieważ nie widzę tu punktu, w którym większość z nich jest tu powtarzana.

+1

Można tworzyć struktury wielowymiarowe za pomocą list zagnieżdżania; 'lindex' i' lset' mają wiele form indeksu specjalnie dla tego przypadku. W przypadkach, gdy potrzebujesz tego rodzaju rzeczy, działa dobrze (i jest szybki). –

3

Tablice TCL są bliższe temu, co Python nazywa dyktatem, i hashowi w Perlu. Więc pomaga myśleć o indeksie jako keystring, zamiast całkowitej index:

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

można wykorzystać funkcję array robić pożyteczne rzeczy, jak wygenerować listę wszystkich klawiszy i można iteracyjne przez tę listę, jeśli musisz. Na przykład można wygenerować listę kluczy, a następnie użyć llength, aby uzyskać rozmiar tablicy.

Działa to najlepiej, jeśli potrzebujesz unikalnego indeksu, aby je znaleźć. Jeśli potrzebujesz tylko uporządkowanej listy, możesz lepiej wykorzystać rzeczywiste funkcje listy, takie jak lappend.

+0

więc domyślam się, że zrobię to w nieco inny sposób niż sposób, w jaki napisałem mój kod powyżej .. – Micheal

+0

Jak wspomniał Edu - foreach jest naprawdę przyjemny do pracy z listami, jest spora szansa, że ​​może ułatwić Ci życie jeśli listy są odpowiednie do rozwiązania twojego problemu. –

+0

również w tym przypadku potrzebuję tablic podobnych do kodu wspomnianego powyżej .. Nie widzę list odpowiednich dla mnie w mojej obecnej sytuacji. – Micheal