:TITLE: Mais comandos de lista - lsearch, lsort, lrange
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese16.lsn,v 1.1 2008/08/02 12:37:36 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 04/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
Podem ser feitas buscas em listas como o comando <CODE>lsearch</CODE>,
ordenações com o comando <CODE>lsort</CODE>, e um intervalo de entradas
da lista pode ser extraído com o comando <CODE>lrange</CODE> command.
<DL>
<B><DT>lsearch</B> <I>lista modelo</I>
<DD> busca na <I>lista</I> por uma entrada que seja compatível com o <I>modelo</I>, 
e retorna o índice do primeiro elemento encontrado, ou um -1 se nenhum elemento for
encontrado.
<B><DT>lsort</B> <I>lista</I>
<DD> ordena a <I>lista</I> e retorna uma nova lista ordenada. Por padrão,
o comando <CODE>lsort</CODE> ordena a lista em ordem alfabética.
<B><DT>lrange</B> <I>lista primeiro último</I>
<DD> retorna uma lista composta das entradas de <I>primeiro</I> até <I>último</I> 
na lista. Se <I>primeiro</I> é menor ou igual a 0, ele é tratado como o primeiro
elemento da lista. Se <I>último</I> é <B>end</B> ou um valor maior que o número
de elementos na lista, ele é tratado como o fim da lista. Se <I>primeiro</I> é
maior que <I>último</I> então uma lista vazia é retornada.
</DL>
<P>
Por padrão, lsearch utiliza o método <B>globbing</B> de busca de elementos compatíveis. 
<B>Globbing</B> é uma técnica de <I>wildcarding</I> que o shell utiliza.
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Podem ser feitas buscas em listas como o comando <CODE>lsearch</CODE>,
ordenações com o comando <CODE>lsort</CODE>, e um intervalo de entradas
da lista pode ser extraído com o comando <CODE>lrange</CODE> command.
<DL>
<B><DT>lsearch</B> <I>lista modelo</I>
<DD> pesquisa na <I>lista</I> por uma entrada que seja compatível com o <I>modelo</I>, 
e retorna o índice do primeiro elemento encontrado, ou um -1 se nenhum elemento for
encontrado.
<B><DT>lsort</B> <I>lista</I>
<DD> ordena a <I>lista</I> e retorna uma nova lista ordenada. Por padrão,
o comando <CODE>lsort</CODE> ordena a lista em ordem alfabética.
<B><DT>lrange</B> <I>lista primeiro último</I>
<DD> retorna uma lista composta das entradas de <I>primeiro</I> até <I>último</I> 
na lista. Se <I>primeiro</I> é menor ou igual a 0, ele é tratado como o primeiro
elemento da lista. Se <I>último</I> é <B>end</B> ou um valor maior que o número
de elementos na lista, ele é tratado como o fim da lista. Se <I>primeiro</I> é
maior que <I>último</I> então uma lista vazia é retornada.
</DL>
<P>
Por padrão, lsearch utiliza o método <B>globbing</B> de busca de elementos compatíveis. 
<B>Globbing</B> é uma técnica de <I>wildcarding</I> que o shell utiliza.
<P>
<B>globbing</B> <I>wildcards</I> são:
<DL>
<B><DT>*</B><DD> Encontra qualquer quantidade de qualquer caracter;
<B><DT>?</B><DD> Encontra uma ocorrência de qualquer caracter;
<B><DT>\X</B><DD> A barra invertida desativa um caracter especial no
globbing da mesma forma que nas substituições Tcl. Utilizando a
barra invertida permite a você utilizar o glob para encontrar um
<B>*</B> ou <B>?</B>;
<B><DT>[...]</B><DD> Encontra uma ocorrência de qualquer caracter dentro
dos colchetes. Um intervalo de caracteres pode ser encontrado utilizando
um intervalo entre colchetes. Por exemplo, [a-z] irá encontrar qualquer
letra minúscula.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Há muitas outras operações que podem ser realizadas na lista.
Listas podem ser:
<UL>
<LI>pesquisadas com o comando <CODE>lsearch</CODE>;
<LI>ordenadas com o comando <CODE>lsort</CODE>;
<LI>um intervalo de entradas da lista pode ser extraído com o 
comando <CODE>lrange</CODE>.
</UL>
<DL>
<B><DT>lsearch</B> <I>lista modelo</I>
<DD> pesquisa na <I>lista</I> por uma entrada que seja compatível com o <I>modelo</I>, 
e retorna o índice do primeiro elemento encontrado, ou um -1 se nenhum elemento for
encontrado.
<B><DT>lsort</B> <I>lista</I>
<DD> ordena a <I>lista</I> e retorna uma nova lista ordenada. Por padrão,
o comando <CODE>lsort</CODE> ordena a lista em ordem alfabética.
<B><DT>lrange</B> <I>lista primeiro último</I>
<DD> retorna uma lista composta das entradas de <I>primeiro</I> até <I>último</I> 
na lista. Se <I>primeiro</I> é menor ou igual a 0, ele é tratado como o primeiro
elemento da lista. Se <I>último</I> é <B>end</B> ou um valor maior que o número
de elementos na lista, ele é tratado como o fim da lista. Se <I>primeiro</I> é
maior que <I>último</I> então uma lista vazia é retornada.
</DL>
<P>
Por padrão, lsearch utiliza o método <B>globbing</B> de busca de elementos compatíveis. 
<B>Globbing</B> é uma técnica de <I>wildcarding</I> que o shell utiliza.
<P>
<B>globbing</B> <I>wildcards</I> são:
<P>
<B><DT>*</B><DD> Encontra qualquer quantidade de qualquer caracter.
<P> <CODE>lsearch $lista a*</CODE> retornaria o índice do primeiro
item da lista que começou com a letra 'a', sem se importar com os
caracteres seguintes.
<B><DT>?</B><DD> Encontra uma ocorrência de qualquer caracter.
<P> <CODE>lsearch $lista a?</CODE> retornaria o índice do primeiro
item da lista que começou com a letra 'a', e tinha apenas um caracter
depois do a.
<B><DT>\X</B><DD> A barra invertida desativa um caracter especial no
globbing da mesma forma que nas substituições Tcl. Utilizando a
barra invertida permite a você utilizar o glob para encontrar um
<B>*</B> ou <B>?</B>.  
<P> 
<CODE>lsearch $lista a\*</CODE> retornaria o índice do primeiro item da
lista que começou com a letra 'a', e tinha um asterisco depois de 'a'.
<B><DT>[...]</B><DD> Encontra uma ocorrência de qualquer caracter dentro
dos colchetes. Um intervalo de caracteres pode ser encontrado utilizando
um intervalo entre colchetes. Por exemplo, [a-z] irá encontrar qualquer
letra minúscula.
<P> <CODE>lsearch $lista [a-e]*</CODE> retornaria o índice do primeiro
item da lista que começou com uma letra entre 'a' e 'e'.
</DL>
<P>
Execute o código do exemplo. Tente remover o * nos comandos lsearch, e
veja como isso afeta a saída.
:TEXT_END:

:CODE_START:

set lista [list {Washington 1789} {Adams 1797} {Jefferson 1801} \
               {Madison 1809} {Monroe 1817} {Adams 1825} ]

set x [lsearch $lista Washington*];
set y [lsearch $lista Madison*];
incr x; incr y -1;		;# Indica a escala para ser não-inclusivo

set subConjLista [lrange $lista $x $y]

puts "Os seguintes presidentes serviram entre Washington e Madison"
foreach item $subConjLista {
  puts "Iniciando em [lindex $item 1]: Presidente [lindex $item 0] "
  }


set x [lsearch $lista Madison*]

set listaOrdenada [lsort $lista]
set y [lsearch $listaOrdenada Madison*]

puts "\n$x Presidentes vieram antes de Madison cronologicamente"
puts "$y Presidentes vieram antes de Madison alfabeticamente"

:TEXT_END: