Informática Numaboa - Tutoriais e Programação
Linguagem Perl - Strings
Sex 21 Nov 2008 18:04 |
- Detalhes
- Categoria: Perl e CGI
- Atualização: Sexta, 21 Novembro 2008 22:21
- Autor: vovó Vicki
- Acessos: 12050
São muitas as possibilidades de manipular strings que a linguagem Perl oferece. Neste tutorial vamos ver os principais recursos disponíveis.
Convenções para Strings
Em Perl, as strings podem ficar entre aspas simples ou duplas. A diferença entre as notações é que, numa sequência de caracteres entre aspas duplas, todos os caracteres especiais são interpretados. Numa sequência de caracteres entre aspas simples, apenas os caracteres especiais mais importantes são interpretados. Exemplos:
Nos exemplos acima, as escalares $Escalar01 a $Escalar16 estão entre aspas duplas. Por este motivo podem conter todos os caracteres especiais.
Os caracteres especiais são precedidos por uma contrabarra \ seguida por uma letra ou um número em notação octal ou hexadecimal.
A $Escalar17 foi colocada entre aspas simples. Neste caso, apenas os caracteres especiais nela utilizados são permitidos, ou seja, \' para indicar aspa simples e \\ para indicar contrabarra.
Observação: Dos sinais especiais da linguagem Perl associada à CGI, o sinal \n tem uma importância especial. É necessário, por exemplo, quando um script CGI envia dados de uma página HTML para um navegador. O envio de dados tem três fases: o tipo de dado que será transmitido, uma linha em branco e os dados propriamente ditos. A linha em branco é obtida através do sinal especial \n. O comando típico para a fase 1 e 2 da transmissão pode ser obtida em apenas uma linha através de
print "Content-type: text/html\n\n";
Extraindo partes de strings
Pode-se extrair uma sequência de caracteres ou um único caracter de uma string. Veja o exemplo:
Neste exemplo extrai-se de um endereço URL, atribuído à escalar $Url, o protocolo (http), o domínio (www.numaboa.com) e o nome do arquivo (index.html). Todas as três partes são atribuídas a escalares próprias. O protocolo está em $Protocolo, o domínio em $Dominio e o nome do arquivo em $NomeArq. Ao final do programa as partes são apresentadas utilizando-se a função print.
A função Perl com a qual é possível extrair uma parte de uma cadeia de caracteres chama-se substr. Esta função possui dois ou três argumentos que devem ser passados como parâmetros. O primeiro parâmetro é a string da qual a sequência de caracteres deve ser extraída. O segundo parâmetro é um número. Este número indica a partir de qual caracter da string a sub-string deve ser extraída. O primeiro caractere da string é o de número 0. Por exemplo, substr("Pedro Henrique",2) retorna "dro Henrique". Como terceiro parâmetro, opcional, pode-se indicar o número de caracteres que se quer extrair. Por exemplo, substr("Pedro Henrique",0,5) retorna Pedro.
Muitas vezes, porém, desconhece-se a posição onde uma parte desejada se inicia, mas se conhece a estrutura da string. Isto também acontece no exemplo acima. A string é um endereço URL e endereços URL têm um estrutura conhecida. Quando se quer extrair o domínio de uma URL, sabe-se que o endereço do domínio se inicia logo após as duas barras //. A Perl oferece para isto as funções index e rindex.
Com index obtém-se o início da posição da primeira ocorrência de um caractere ou seqüência de caracteres e com rindex obtém-se o início da posição da última ocorrência. Ambas as funções possuem dois argumentos. O primeiro é a string que será pesquisada, o segundo é a sub-string que é procurada. As duas funções retornam um número. Este número pode ser utilizado como segundo parâmetro da função substr. Por exemplo, index("Os micos fazem micagens","mic") retorna 3, o início da primeira ocorrência de "mic", e rindex("Os micos fazem micagens","mic") retorna 15, o início da última ocorrência.
É aconselhável atribuir os valores de retorno destas funções a escalares próprias, como no exemplo acima. Estas variáveis escalares podem ser confortavelmente retrabalhadas posteriormente.
Observação: Outra função interessante para strings é a length (length = comprimento), também usada no exemplo. Esta função retorna o número de caracteres que compõem uma string.
Transformando strings em listas
Quanto se tem strings que tenham caracteres específicos para separar partes, pode-se tratar estes caracteres como delimitadores e transferir as partes para uma lista. Veja um exemplo:
No exemplo, a escalar $CVS_Linha contém uma linha típica de um arquivo de dados delimitados por vírgulas. Muitos programas de banco de dados e planilhas oferecem a possibilidade de gravar arquivos neste formato. Tais arquivos são gravados geralmente com a extensão .cvs. Quando se faz a leitura linha por linha de um arquivo deste tipo, obtém-se, para cada linha, um conteúdo parecido com o da variável escalar $CVS_Linha.
Utilizando a função split (split = rachar, separar), pode-se separar o conteúdo em campos e armazená-los numa lista. Define-se uma lista, como a lista @Endereco, à qual se atribui os valores de retorno da função split. A função split possui dois argumentos, opcionalmente três. Como primeiro parâmetro envia-se uma expressão regular, através da qual o delimitador de campos é enviado. No exemplo acima, é apenas a vírgula. A string é enviada como segundo parâmetro, a partir do qual será gerada a lista. No exemplo acima, é a escalar $CVS_Linha. Como terceiro parâmetro pode-se enviar, opcionalmente, o número máximo de campos que devem ser gerados. No exemplo dado, o terceiro parâmetro não seria necessário - consta apenas para apresentar integralmente a função.
Concatenando elementos de lista em strings
O procedimento inverso ao anterior também pode ser feito. É possível criar uma string a partir dos elementos de uma lista:
Aqui atribuimos um endereço à lista @Partes, com campos para cada dado. Esta lista pode ser transformada numa string com a ajuda da função join e com o caractere (ou caracteres) delimitador que servirá como elemento de separação. A função join, portanto, faz o oposto da função split.
Define-se uma escalar, como a $CVS_Linha, à qual é atribuído o valor de retorno da função join. Esta função possui dois argumentos. O primeiro aguarda como parâmetro o caractere (ou caracteres) delimitador que servirá como elemento de separação. Novamente, apenas uma vírgula. O segundo aguarda como parâmetro uma lista que fornecerá os elementos que comporão a string. No exemplo, a lista é @Partes.
Inserindo, substituindo e eliminando elementos de listas
As listas não precisam ter um conteúdo homogêneo nem um comprimento fixo. Elas podem, durante a execução de um script, terem o número de elementos aumentados ou diminuídos.
Exemplo 1 - Inserir um elemento:
Exemplo 2 - Eliminar um elemento:
Exemplo 3 - Substituir um elemento:
Exemplo 4 - Reordenar elementos:
Com a ajuda da função push pode-se adicionar um novo elemento a uma lista. No exemplo 1, a lista @Endereco recebe um novo elemento que contém um endereço de e-mail. A função push recebe como primeiro parâmetro a lista à qual serão adicionados um ou mais elementos. Como segundo parâmetro, o(s) elemento(s) que serão inseridos na lista. Estes podem ser strings ou números. Quando mais de um elemento é adicionado eles devem ser separados por vírgulas.
A contrabarra que se vê no endereço de e-mail não pertence a este endereço. É apenas uma máscara (ou um escape) para a arroba @, uma vez que este caractere tem significado próprio na Perl (identifica as listas).
Com a ajuda da função pop pode-se eliminar o último elemento de uma lista. Para isto, envia-se como parâmetro a lista da qual se quer eliminar o último elemento. No exemplo 2, a lista é @Endereco e o elemento eliminado corresponde ao CEP e cidade.
Para substituir determinado elemento de uma lista, basta referenciá-lo e atribuir-lhe o novo valor. Veja o exemplo 3.
O exemplo 4 mostra como reordenar "manualmente" os elementos de uma lista. Para isto, a função shift é a mais indicada. Esta função elimina o primeiro elemento de uma lista e a devolve como valor de retorno. Com isto, todos os elementos da lista sobem uma posição, de modo que o segundo torna-se primeiro, etc. Para não perder o elemento tirado da lista, é aconselhável atribuí-lo temporariamente a uma escalar. No exemplo 4 este elemento foi atribuído à escalar $Temp e, através da função push, foi inserido no final da lista - tudo ocorrendo dentro de um loop do tipo for para tratar de todos os elementos existentes. O resultado do exemplo 4 coloca CEP e cidade no início da lista, seguido do nome e da rua.
Ordenando elementos de listas
Uma característica poderosa da Perl é a capacidade de ordenação.
Exemplo 1 - Ordenando strings numa lista:
Exemplo 2 - Ordenando Números:
Para a ordenação automática de listas existe a função sort. Esta função ordena alfabeticamente, em ordem ascendente, os elementos de uma lista que é indicada como parâmetro. Para obter este resultado basta o comando @Ordem = sort(@Netos) como no exemplo 1 - a lista @Netos é ordenada alfabeticamente e atribuída à lista @Ordem.
A coisa é um pouco mais complicada quando se quer ordenar valores numéricos, como no exemplo 2. Para isto é necessária uma subrotina com determinadas características, uma vez que a função sort a chama quando necessário. A subrotina OrdenaNumeros pode ser usada para este propósito. Através da diretiva @ListaOrdenada = sort OrdenaNumeros @Recordes;, a lista @Recordes é ordenada numericamente. Nesta formulação, é melhor não usar parênteses.
Se for necessária uma ordenação de valores numéricos em ordem decrescente, pode-se usar a função reverse. No exemplo 2, após obter a lista @ListaOrdenada, ordenada em ordem crescente, a mesma é invertida em @Decrescente através da diretiva @Decrescente = reverse @ListaOrdenada;.
Substituindo caracteres ou seqüências de caracteres
A poderosa ferramenta das expressões regulares também é utilizada com frequência para substituir ou eliminar determinados caracteres ou sequências de caracteres. Para isso, existe uma sintaxe especial.
Exemplo 1 - Eliminar letras e espaços:
Exemplo 2 - Substituir caracteres especiais por compatíveis com HTML:
Exemplo 3 - Eliminar e bloquear erros:
O esquema para todos os procedimentos de busca-substituição em Perl é:
{xtypo_info}String =~ s/PadraoBusca/PadraoSubstituicao/[Opcoes]{xtypo_info}String é geralmente uma escalar que contém uma cadeia de caracteres, como em $Texto do exemplo 1, seguida da atribuição =~, um espaço e a letra minúscula s. Logo após o s vem uma expressão regular, marcada pelas barras /.../. Para esta expressão de busca valem as mesmas regras das expressões regulares. Após a barra de finalização vem uma segunda expressão contendo um ou mais caracteres que substituirão o resultado da busca. A segunda expressão também recebe uma barra de finalização. Após esta última, podem constar, entre colchetes, opções que definam a execução da busca-substituição. As opções são indicadas por letras minúsculas permitidas, das quais as mais importantes são:
- g busca/substitui todas as ocorrências encontradas (por padrão, apenas a primeira ocorrência é substituída)
- i busca/procura letras independente da caixa, tanto as minúsculas quanto as maiúsculas (por padrão uma letra minúscula é considerada diferente da sua versão maiúscula)
No exemplo 1, todas as letras (maiúsculas e minúsculas) e todos os espaços são retirados de $Texto, portanto, só sobram os números.
No exemplo 2, todos os caracteres especiais (ç, ã, õ, é, ó) encontrados em $Texto são substituídos pela forma compatível com HTML.
No exemplo 3 são retirados da lista @NotasEscolares todos os valores que não estejam entre 1 e 6. Para tanto, os valores da lista foram concatenados numa string única, atribuída à escalar $CadeiaDeNotas. Logo após são retirados todos os valores que não estiverem entre 1 e 6, além de todas as letras, utilizando-se um padrão de substituição vazio. A seguir, a cadeia de caracteres tratada é transformada numa lista sem elementos vazios. Os elementos vazios foram tratados pela expressão regular /,|,,/. A nova lista contém apenas as notas que se enquandraram no critério escolhido.