:TITLE: Comparações de string - compare match first last wordend
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl18.lsn,v 1.10 2000/04/24 16:17:51 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:
Há 6 subcomandos de strings que fazem comparação e busca
em strings:
<DL>
<B><DT>string compare</B> <I>string1 string2</I>
<DD>Compara <I>string1</I> com <I>string2</I> e retorna:
  <UL>
  <LI>-1 ........ Se <I>string1</I> é menor que <I>string2</I>
  <LI> 0 ........ Se <I>string1</I> igual a <I>string2</I>
  <LI> 1 ........ Se <I>string1</I> é maior que <I>string2</I>
  </UL>
</DL>
Essas comparações são feitas lexicograficamente, não numericamente.
<P>
<B><DT>string first</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o primeiro encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string last</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o último encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string wordend</B> <I>string índice</I>
<DD> Retorna o índice do caracter imediatamente depois do último caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string wordstart</B> <I>string índice</I>
<DD>Retorna o índice do caracter imediatamente antes do primeiro caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string match</B> <I>modelo string</I>
<DD> Retorna 1 se o <I>modelo</I> for compatível com a <I>string</I>. <I>Modelo</I>
é um modelo do estilo glob.
<P>
<B>Globbing</B> é a técnica <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 1:
Há 6 subcomandos de strings que fazem comparação e busca
em strings:
<DL>
<B><DT>string compare</B> <I>string1 string2</I>
<DD>Compara <I>string1</I> com <I>string2</I> e retorna:
  <UL>
  <LI>-1 ........ Se <I>string1</I> é menor que <I>string2</I>
  <LI> 0 ........ Se <I>string1</I> igual a <I>string2</I>
  <LI> 1 ........ Se <I>string1</I> é maior que <I>string2</I>
  </UL>
</DL>
Essas comparações são feitas lexicograficamente, não numericamente.
<P>
<B><DT>string first</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o primeiro encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string last</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o último encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string wordend</B> <I>string índice</I>
<DD> Retorna o índice do caracter imediatamente depois do último caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string wordstart</B> <I>string índice</I>
<DD>Retorna o índice do caracter imediatamente antes do primeiro caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string match</B> <I>modelo string</I>
<DD> Retorna 1 se o <I>modelo</I> for compatível com a <I>string</I>. <I>Modelo</I>
é um modelo do estilo glob.
<P>
<B>Globbing</B> é a técnica <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:
Operações que são freqüentemente realizadas em strings incluem
pesquisa por um modelo, ou comparação de uma string com outra.
Nesta lição, os comandos de string para busca e comparação são
discutidos. 
<P>
Tcl tem muitos métodos de busca por uma string dentro de
outra string. 
<P>
<I>first</I> e <I>last</I> são os subcomandos de
string que irão retornar a primeira e última ocorrência de uma
string dentro de outra. Você poderia usar esses comandos para
pesquisar em um arquivo de texto por uma palavra em particular.
<P>
O subcomando <I>match</I> irá dizer para você se um modelo ocorre
dentro de uma string. Ele usa as mesmas regras de <B>globbing</B> 
assim como o comando <B>lsearch</B>.
<P>
O <I>string compare</I> irá dizer para você se uma string vem antes de
outra, alfabeticamente. Isso é útil para ordenar um conjunto de
strings em ordem alfabética.
<P>
As descrições desses comandos são feitas a seguir:
<P>
<DT>
<B>string compare</B> <I>string1 string2</I>
<DD>Compara <I>string1</I> com <I>string2</I> e retorna:
  <UL>
  <LI>-1 ........ Se <I>string1</I> é menor que <I>string2</I>
  <LI> 0 ........ Se <I>string1</I> igual a <I>string2</I>
  <LI> 1 ........ Se <I>string1</I> é maior que <I>string2</I>
  </UL>
Essas comparações são feitas lexicograficamente, não numericamente.
<P>
<B><DT>string first</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o primeiro encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string last</B> <I>string1 string2</I>
<DD> Retorna o índice do caracter em <I>string1</I>
que inicia o último encontro de <I>string2</I>, ou -1 se não há
o encontro de <I>string2</I> na <I>string1</I>
<B><DT>string wordend</B> <I>string índice</I>
<DD> Retorna o índice do caracter imediatamente depois do último caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string wordstart</B> <I>string índice</I>
<DD>Retorna o índice do caracter imediatamente antes do primeiro caracter
na palavra que contém o <I>índice</I> do caracter da <I>string</I>. Uma
palavra é qualquer conjunto contíguo de letras, números ou 
um outro caracter.
<B><DT>string match</B> <I>modelo string</I>
<DD> Retorna 1 se o <I>modelo</I> for compatível com a <I>string</I>. <I>Modelo</I>
é um modelo do estilo glob.
<P>
<B>Globbing</B> é a técnica <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>
<P>
No exemplo, <CODE>first</CODE> e <CODE>last</CODE> são usados para
encontrar a primeira e última barra no caminho.
Sabendo se o primeiro caracter é uma "/", nós podemos dizer se um
caminho é absoluto ou relativo.
<P>
O valor de <CODE>last</CODE> é incrementado antes de nós testarmos
para ver se "/" é o último caracter na string porque Tcl numera 
caracteres em uma string a partir de 0. Se houver dois caracteres
em uma string, <CODE> string length </CODE> retornaria um 2,
obviamente, e <CODE>string last</CODE> reportaria o último
caracter na posição 1. Se a "/" é o último caracter, então
<CODE>last</CODE> volta 2 espaços, uma vez que 
<CODE>string range</CODE> retorna todos os caracteres do início
ao fim, incluindo as posições de início e fim.
<P>
Na seção final do código, a comparação com "a", nós determinamos
se o primeiro caracter da string é maiúsculo ou minúsculo. A
ordem dos caracteres que um computador usa vai de 0 a 9, então
'A' a 'Z', e finalmente de 'a' a 'z'. Qualquer letra menor que 'a'
é uma letra maiúscula. Este é um teste lembrado muito simples que 
irá reportar números como sendo letras maiúsculas.
<P>
Tente reescrever este exemplo usando o comando <CODE>split</CODE> 
para separar as partes do caminho em elementos de lista separados.
:TEXT_END:

:CODE_START:
set caminhoAbsoluto "/usr/home/clif/TCL_STUFF/TclTutor/Lsn.17"
set caminhoRelativo "CVS/Entries"
set caminhoDiretorio "/usr/bin/"

set caminhos [list $caminhoAbsoluto $caminhoRelativo $caminhoDiretorio]

foreach caminho $caminhos  {
  set primeira [string first "/" $caminho];
  set ultima [string last "/" $caminho];

;# Diz se o caminho é absoluto ou relativo

  if {$primeira != 0} {
    puts "$caminho é um caminho relativo"
    } else {
    puts "$caminho é um caminho absoluto"
    }

  ;# Se "/" não é o último caracter no $caminho, indica a última palavra
  ;# caso contrário, remove a última "/", e encontra a próxima até a última "/"
  ;# e indica a última palavra.

  incr ultima
  if {$ultima != [string length $caminho]} {
    set nome [string range $caminho $ultima end]
    puts "O arquivo referenciado no $caminho é $nome"
    } else {
    incr ultima -2
    set tmp [string range $caminho 0 $ultima]
    set ultima [string last "/" $tmp];
    incr ultima
    set nome [string range $tmp $ultima end]
    puts "O diretório final em $caminho é $nome"
    }

  ;# CVS é um diretório criado pelo código fonte controle CVS do sistema.
  ;#

  if {[string match "*CVS*" $caminho]} {
    puts "$caminho é parte da árvore de controle de código fonte"
    }

  ;# Compara com "a" para determinar se o primeiro caracter é
  ;# maiúsculo ou minúsculo
  set comparacao [string compare $nome "a"]
  if {$comparacao >= 0} {
    puts "$nome inicia com uma letra minúscula\n"
    } else {
    puts "$nome inicia com uma letra maiúscula\n"
    }
  }
:TEXT_END:

