2012-04-15 6 views
6

Ho bisogno di aiuto per definire gli array e visualizzarli e fare il looping su di essi in TCL.definizione e looping attraverso gli array tcl

Ecco come li farei in 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]; 
} 

Mi piacerebbe fare lo stesso con tcl.È il seguente codice appropriato?

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

Inoltre, posso definire $ set come array. Alcuni, come come:

set date array(); 

Così ho modificato il mio codice ha provato un semplice test utilizzando implementazione gamma di RSeeger:

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

quanto sopra doesnt restituire nulla v'è probabilmente un errore. Ho anche provato: mette $ date ($ key) senza virgolette ma questo non funziona neanche.

+2

Si potrebbe beneficiare del [Tutorial Tcl] (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) –

+1

Il problema con il tuo ultimo frammento di codice è che manca uno spazio tra '[matrice nomi date]' e '{'. Quello spazio è ** significativo ** in Tcl! Separa la cosa che viene iterata su (i contenuti degli array serializzati) dallo script da eseguire per ogni iterazione. In generale, con Tcl devi _ separare correttamente le tue parole; diventa rapidamente una seconda natura (e io tendo a fare la stessa cosa ora anche in molti altri linguaggi, dato che lo spazio bianco extra aumenta la leggibilità quasi ovunque, a condizione che sia semanticamente legale). –

risposta

8

Se stai cercando di indicizzare le cose in base al numero (che il tuo codice implica), utilizza uno list. È analogo a un array in 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]" 
} 

Se si vuole le cose indice da stringa (o di avere un elenco sparso), è possibile utilizzare un array, che è un HashMap di chiave- valore >.

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

Grazie a @RHSeeger. Ho provato uno dei tuoi metodi ma non funziona. guarda le mie modifiche sopra – Micheal

+0

, non importa .. funziona ... grazie ancora! – Micheal

+0

Continuo a pensare che staresti meglio usando le liste e non gli array. – RHSeeger

5

In Tcl, il concetto di array si differenzia da molti altri linguaggi di programmazione e quello che Tcl chiama un array è spesso chiamato hash map o array associativo altrove. Gli indici di array non sono limitati a numeri interi ma possono essere stringhe legali. Il più delle volte mi trovo ad usare liste (o liste di liste) invece di matrici per la manipolazione dei dati. Per eseguire il ciclo attraverso un intero elenco o un array è possibile utilizzare il comando foreach.

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

Non è necessario inizializzare l'array prima di impostarne i valori, è sufficiente iniziare ad aggiungere i membri. membri di matrice individuali sono riferimento come

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

ci sono array multidimensionali in Tcl, ma possono essere simulati da avere nomi chiave consistenti, ad esempio

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

parte questo, mi sarebbe solo puntare a wiki Tcl per lo più eccellente ed è array page e array man page per problemi di sintassi in quanto non vedo punto ripetere la maggior parte del loro contenuto qui.

+1

È possibile eseguire strutture multidimensionali mediante nidificazione di elenchi; 'lindex' e' lset' hanno moduli multiindice appositamente per questo caso. Per i casi in cui è necessario questo tipo di cose, funziona bene (e anche veloce). –

3

Gli array TCL sono più vicini a ciò che Python chiama un dict e un hash in Perl. modo che aiuta a pensare al indice come keystring, piuttosto che un intero indice:

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

È possibile utilizzare la funzione array di fare cose utili, come generare un elenco di tutte le chiavi, e si può iterare attraverso quella lista se è necessario. Ad esempio, è possibile generare un elenco di chiavi e quindi utilizzare llength per ottenere le dimensioni dell'array.

Questo funziona meglio se è necessario un indice univoco per trovarli. Se hai solo bisogno di una lista ordinata, allora potresti stare meglio usando le effettive funzioni di lista come lappend.

+0

quindi credo che dovrò farlo in un modo leggermente diverso rispetto al modo in cui ho scritto il mio codice sopra .. – Micheal

+0

Come menzionato da Edu - foreach è davvero bello per lavorare con le liste, ci sono buone probabilità che possa semplificarti la vita se le liste sono adatte a risolvere il tuo problema. –

+0

beh in questo caso ho bisogno di array simili al codice menzionato sopra..Non vedo liste adatte per me nella mia situazione attuale .. – Micheal