A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Linguagem Perl - Strings

Sex

21

Nov

2008


18:04

(2 votos, média 5.00 de 5) 


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:

#!/usr/bin/perl $CSV_Linha = "Maria Vaz Soura,Rua do Sobe e Desce 13,86600-000 Cambé"; @Endereco = split(/,/,$CSV_Linha,3); $i = 0; for(@Endereco) { print $i+1, ". Campo do Endereço: ", $Endereco[$i], "\n"; $i++; }

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:

#!/usr/bin/perl @Partes = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Cambé"); $CSV_Linha = join(",",@Partes); print "A string gerada é: ", $CSV_Linha, "\n";

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:

#!/usr/bin/perl @Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Cambé"); push(@Endereco,"maria\@numaboa.com"); for(@Endereco) { print $_, "\n"; }

Exemplo 2 - Eliminar um elemento:

#!/usr/bin/perl @Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Cambé"); pop(@Endereco); for(@Endereco) { print $_, "\n"; }

Exemplo 3 - Substituir um elemento:

#!/usr/bin/perl @Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Cambé"); $Endereco[1] = "Rua Dr. Esfregão 7"; for(@Endereco) { print $_, "\n"; }

Exemplo 4 - Reordenar elementos:

#!/usr/bin/perl @Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Cambé"); for($i=1;$i<3;$i++) { $Temp = shift(@Endereco); push(@Endereco,$Temp); } for(@Endereco) { print $_, "\n"; }

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:

#!/usr/bin/perl @Netos = ("Júlia", "Pedro", "Helena", "Clara", "João"); @Ordem = sort(@Netos); for(@Ordem) { print $_, "\n"; }

Exemplo 2 - Ordenando Números:

#!/usr/bin/perl @Recordes = (9834, 9837, 5989, 4509, 4329, 6509, 2837, 8289, 10845); @ListaOrdenada = sort OrdenaNumeros @Recordes; @Decrescente = reverse @ListaOrdenada; for(@Decrescente) { print $_, "\n"; } sub OrdenaNumeros { if($a < $b) { return -1; } elsif($a == $b) { return 0; } else { return 1; } }

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;.

Informações adicionais