![]() |
Tcl/Tk
Curso On-Line de Programação |
Estruturas de dados
Tcl suporta dois tipos de estruturas de
dados: vetores associativos e listas. A seguir estudaremos
cada uma dessas estruturas, assim como os recursos que Tcl oferece para
manipulá-las.
Vetores associativos
Vetores são variáveis capazes de armazenar vários valores ao mesmo tempo. Sendo que cada valor é referenciado por um índice, de modo semelhante a uma matriz.
Vetores podem ter uma, duas ou múltiplas dimensões. No entanto, é mais comun trabalhar com vetores com até 5 dimensões. Neste caso, na resolução de sistemas de equações com múltiplas variáveis.
Observe o exemplo de um vetor típico:
Suponhamos que queiramos armazenar os nomes dos dias da semana em um vetor:
dia(1) = "domingo"
dia(2) = "segunda-feira"
dia(3) = "terça-feira"
dia(4) = "quarta-feira"
dia(5) = "quinta-feira"
dia(6) = "sexta-feira"
dia(7) = "sábado"
Em Tcl faríamos:
set dia(1) "domingo"
set dia(2) "segunda-feira"
set dia(3) "terça-feira"
set dia(4) "quarta-feira"
set dia(5) "quinta-feira"
set dia(6) "sexta-feira"
set dia(7) "sábado"E para lermos o nome do dia armazenado na posição 2:
puts $dia(2)Se você já conhece outras linguagens de programação, deve estar se perguntando se Tcl começa os números dos índices com zero(0) ou um(1). A resposta é: Tcl não começa. De fato, Tcl trabalha com vetores associativos. Dessa forma os índices pode ser números, letras, palavras ou qualquer combinação de caracteres.
Suponha que você queira armazenar os dados de um cliente em um vetor cliente. Podemos armazenar o nome do cliente no elemento nome do vetor, enquanto o telefone seria armazenado no elemento telefone, e o e-mail no elemento e-mail:
set cliente(nome) "Roberto Luiz Souza Monteiro"
set cliente(telefone) "+55-71-9121-7576"
set cliente(e-mail) "souzamonteiro@souzamonteiro.com"Para acessarmos o nome do cliente faríamos:
puts $cliente(nome)E na verdade, é assim que trabalham os bancos de dados em Tcl: atribuindo o registro corrente a um vetor associativo. Para entender melhor como funcionam vetores associativos em bancos de dados, veja o código fonte da biblioteca TDO - Tcl Database Access Objects, disponível em http://www.souzamonteiro.com/tdo.shtml.
Tcl oferece as seguintes funções
para tratamento de vetores:
| Função | Descrição |
| array anymore | Verifica, e retorna 1, se ainda existirem elementos a serem pesquisados no vetor. |
| array donesearch | Termina uma busca em um vetor. |
| array exists | Verifica, e retorna 1, se o vetor existir. |
| array get | Retorna uma lista onde cada elemento ímpar corresponde ao nome do elemento no vetor, e cada elemento par corresponde ao valor do elemento. |
| array names | Retorna uma lista com os nomes de cada elemento no vetor. |
| array nextelement | Retorna o nome do próximo elemento no vetor. |
| array set | Atribui a cada elemento no vetor, o valor correspondente ao existente na lista fornecida. |
| array size | Retorna o número de elementos no vetor. |
| array startsearch | Retorna um ponteiro para uma busca sequencial em um vetor. |
| parray | Exibe, na saída padrão, os nomes e os valores de todos os elementos no vetor, que correspondam ao padrão especificado. |
Exemplos
Suponha o vetor dos dias da semana:
set dia(1) "domingo"
set dia(2) "segunda-feira"
set dia(3) "terça-feira"
set dia(4) "quarta-feira"
set dia(5) "quinta-feira"
set dia(6) "sexta-feira"
set dia(7) "sábado"
array get
puts [array get dia]Retornará:
4 quarta-feira 5 quinta-feira 1 domingo 6 sexta-feira 2 segunda-feira 7 sábado 3 terça-feira
array names
puts [array names dia]Retornará:
4 5 1 6 2 7 3
array size
puts [array size dia]Retornará:
7
parray
puts [parray dia]Retornará:
dia(1) = domingo dia(2) = segunda-feira dia(3) = terça-feira dia(4) = quarta-feira dia(5) = quinta-feira dia(6) = sexta-feira dia(7) = sábado
Listas
Listas são provavelmente as estruturas de dados mais poderosas. De fato, Tcl oferece muitos recursos para manipulação de listas. Mas o que são listas?
Listas são estruturas capazes de armazenar coleções de dados, de forma estruturada. Uma lista pode conter outras listas aninhadas e é possivel ordenar e pesquisar listas do mesmo modo como se faria em um banco de dados, e com a mesma eficiência.
Veja o seguinte exemplo:
Suponha um banco de dados de clientes,
onde cada registro conteria o nome, o telefone e o e-mail de cada cliente.
Tcl poderia armazenar o banco de dados em uma lista, onde cada registro
sera armazenado em um elemento da lista como uma segunda lista, e nesta
segunda lista cada elemento corespoderia a um campo no banco de dados:
{
{nome telefone e-mail}
{"Roberto Luiz Souza Monteiro" "+55-71-9121-7576" "souzamonteiro@souzamonteiro.com"}
{"Katia Souza Monteiro" "+55-71-242-8798" "katia@souzamonteiro.com"}
{"Regina C. S. de Andrade" "+55-71-386-0627" "regina@souzamonteiro.com"}
}
Sabendo que o primeiro elemento na
lista corresponde à lista de nomes dos campos na tabela, cada elemento
seguinte, corresponde a uma linha, ou registro, na tabela. E de fato, no
banco de dados TclVSdb, os dados são armazenados dessa forma nas
tabelas do banco de dados.
Tcl oferece as seguintes funções
para tratamento de listas:
| Função | Descrição |
| concat | Concatena várias lista para formar uma nova lista. |
| join | Converte uma lista em uma string, separando os elementos da lista com o separador indicado. |
| lappend | Adiciona um elemento ao final da lista. |
| lindex | Retorna o valor do elemento indicado na lista. |
| linsert | Insere um elemento em uma lista. Na verdade retorna uma nova lista. |
| list | Cria uma lista, a partir dos elementos fornecidos como argumentos. |
| llength | Retorna o tamanho de uma lista. |
| lrange | Retorna uma lista contendo os elementos dentro da faixa especificada. |
| lreplace | Substitui valores em uma lista. Na verdade retorna uma nova lista. |
| lsearch | Executa uma busca em uma lista. Suporta expressões regulares. |
| lsort | Ordena uma lista. Suporta várias opções. Na verdade retorna uma nova lista. |
| split | Converte uma string em uma lista, considerando um caractere especificado na string, como o separador dos elementos. |
Exemplos
concat
set tabela {}
puts [llength $tabela]Retornará 0.
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira sabado]
puts [llength $tabela]Retornará 7, pois será criada uma nova lista onde cada elemento da lista corresponderá a uma das strings fornecidas.
join
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira sabado]
puts [join $tabela ","]Retornará:
domindo,segunda-feira,terca-feira,quarta-feira,quinta-feira,sexta-feira,sabado
lappend
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira]
puts [llength $tabela]Retornará 6.
lappend tabela sabado
puts [llength $tabela]Retornará 7.
lindex
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira sabado]
puts [lindex $tabela 2]Retornará:
terca-feira
llength
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira sabado]
puts [llength $tabela]Retornará 7.
lsearch
set tabela [concat domindo segunda-feira terca-feira quarta-feira quinta-feira sexta-feira sabado]
puts [lsearch -exact $tabela quarta-feira]Retornará 3, pois o quarta-feira é o elemento número 3. Domingo é o elemento 0.
lsort
set tabela {vermelho alaranjado amarelo verde azul anil violeta}
puts [lsort -increasing $tabela]Retornará:
alaranjado amarelo anil azul verde vermelho violetaSe estivermos trabalhando com registros, onde:
set cliente {
{1 {Roberto Luiz Souza Monteiro}}
{2 {Katia Souza Monteiro}}
{3 {Adriano Lavigne}}
}
puts [lsort -increasing -index 1 $cliente]Retornará:
{3 {Adriano Lavigne}} {2 {Katia Souza Monteiro}} {1 {Roberto Luiz Souza Monteiro}}
Observe que se você estiver atribuindo
elementos a uma lista de forma estruturada, em um arquivo de script, como
foi feito acima, deve terminar cada linha com o caractere \ pois Tcl interpreta
o caractere de final de linha \n como o final do comando.
Assim a atribuição da lista de clientes ficaria:
set cliente { \
{1 {Roberto Luiz Souza Monteiro}} \
{2 {Katia Souza Monteiro}} \
{3 {Adriano Lavigne}} \
}No shell do interpretador Tcl( wish ou tclsh ) isso não é necessário: você pode copiar e colar o fragmento de código anterior, na linha de comandos do wish, que ele funcionará corretamente.
split
Suponha uma função que lê um arquivo de configurações, onde exista a estrutura:
variável=valorPodemos usar split para quebrar a string lida do arquivo, em uma lista onde o elemento 0 será o nome da variável e o elemento 1 o valor da variável:
set linha "showtip=false"
set token [split $linha =]
puts [lindex $token 0]
puts [lindex $token 1]Retornará:
showtip
false
Para uma descrição detalhada
de todas as funções para tratamento de vetores e listas,
consulte a documentação on-line, ou o Tcl/Tk
Reference Guide, ou ainda o Tcl/Tk
Electronic Reference.
Para maiores informações envie e-mail para info@souzamonteiro.com.
| http://www.souzamonteiro.com |
Copyright(C) 2000 by Roberto Luiz Souza Monteiro