2012-04-15 19 views
6

Necesito ayuda para definir matrices y visualizarlas y bucles entre ellas en TCL.definición y bucle a través de matrices tcl

Así es como los haría en 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]; 
} 

Me gustaría hacer lo mismo con tcl.Es el siguiente código?

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

También puedo definir set $ date como una matriz. A algunos les gusta como:

set date array(); 

Así que he editado mi código trató de una prueba simple usando RSeeger de aplicación matriz:

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

el imposible de volver por encima de cualquier cosa es probable que haya algún error. También probé: pone $ date ($ key) sin comillas, pero eso tampoco funciona.

+2

que se beneficiaría de la [Tutorial Tcl] (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) –

+1

El problema con el último fragmento de código es que carece de un espacio entre '[array names date]' y the '{'. ¡Ese espacio es ** significativo ** en Tcl! Separa la cosa sobre la que se itera (los contenidos de la matriz serializada) del script para ejecutar para cada iteración. En general, con Tcl usted _debe_ separar sus palabras correctamente; rápidamente se convierte en una segunda naturaleza (y tiendo a hacer lo mismo ahora en muchos otros idiomas también, ya que el espacio en blanco adicional aumenta la legibilidad en casi todas partes, siempre que sea semánticamente legal). –

Respuesta

8

Si está buscando indizar cosas por número (lo que implica su código), use un list. Es análogo a una matriz en 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]" 
} 

Si quieres cosas de índice por cadena (o tener una lista escasa), se puede utilizar un array, que es un HashMap de número- valor >.

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

Gracias @RHSeeger. Intenté uno de tus métodos, pero no funciona. ver mis ediciones arriba – Micheal

+0

no importa ... está funcionando ... ¡gracias de nuevo! – Micheal

+0

Sigo pensando que sería mejor usar listas y no arreglos. – RHSeeger

5

En Tcl, el concepto de matriz difiere de muchos otros lenguajes de programación y lo que Tcl llama una matriz a menudo se denomina mapa hash o matriz asociativa en otro lugar. Los índices de matriz no están limitados a números enteros, sino que pueden ser cadenas legales. La mayoría de las veces me encuentro usando listas (o listas de listas) en lugar de matrices para la manipulación de datos. Para recorrer una lista completa o una matriz, puede usar el comando foreach.

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

No tiene que inicializar la matriz antes de establecer sus valores, simplemente comience a agregar los miembros. miembros de la matriz individuales son referenciados como

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

No hay matrices multidimensionales en Tcl, pero pueden ser simulados por tener nombres clave compatibles, por ejemplo

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

Aparte de eso, sólo lo haría te dirijo a la excelente wiki Tcl y es array page y array man page para problemas de sintaxis ya que no veo punto repetir la mayor parte de su contenido aquí.

+1

Puede hacer estructuras multidimensionales anidando listas; 'lindex' y' lset' tienen formularios de múltiples índices específicamente para este caso. Para los casos en que necesita ese tipo de cosas, funciona bien (y también es rápido). –

3

Las matrices TCL están más cerca de lo que Python llama dict y hash en Perl. por lo que ayuda a pensar en el índice como keystring, en lugar de un número entero índice:

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

Usted puede utilizar la función array hacer cosas útiles, como generar una lista de todas las claves, y se puede repetir a través de esa lista si es necesario. Por ejemplo, podría generar una lista de claves y luego usar llength para obtener el tamaño de la matriz.

Esto funciona mejor si necesita un índice único para encontrarlos. Si solo necesita una lista ordenada, entonces es mejor que use funciones de lista reales como lappend.

+0

así que supongo que tendré que hacerlo de una manera ligeramente diferente a la forma en que escribí mi código anterior. – Micheal

+0

Como mencionó Edu - foreach es realmente bueno para trabajar con listas, hay una buena posibilidad de que pueda hacer su vida más fácil si las listas son adecuadas para resolver su problema. –

+0

Bueno, en este caso necesito matrices similares al código mencionado anteriormente ... No veo listas adecuadas para mí en mi situación actual ... – Micheal

Cuestiones relacionadas