Informática Numaboa - Tutoriais e Programação

Linguagem Perl - Strings

Sex

21

Nov

2008


18:04

  • Imprimir
(2 votos, média 5.00 de 5) 


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:

$Escalar01 = "Aqui segue uma\nQuebra de linha"; $Escalar02 = "Aqui segue uma\fQuebra de página"; $Escalar03 = "Aqui segue um\bBackspace"; $Escalar04 = "Aqui segue um\rRetorno de carro"; $Escalar05 = "Aqui segue um\tTab"; $Escalar06 = "Aqui segue um\vTab Vertical"; $Escalar07 = "Aqui segue um\aSinal de alarme"; $Escalar08 = "Aqui segue um\012 Carcater com valor octal de 012"; $Escalar09 = "Aqui segue um\x7f Caracter com valor hexadecimal de 7f"; $Escalar10 = "Aqui segue um\cC Control-C (aqui: [Ctrl]+[C])"; $Escalar11 = "Aqui seguem\"Aspas"; $Escalar12 = "Aqui segue uma\\Contrabarra"; $Escalar13 = "Este \lA é interpretado como minúsculo (a)"; $Escalar14 = "Esta \LPALAVRA\E é interpretada como minúscula (palavra)"; $Escalar15 = "Este \ua é interpretado como A maiúsculo"; $Escalar16 = "Esta \Upalavra\E é interpretada como PALAVRA em maiúsculo"; $Escalar17 = 'Aqui só \\ e\' são interpretados';

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.

info 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:

#!/usr/bin/perl $Url = "http://www.numaboa.com/index.html"; $Stop = index($Url,":"); $Protocolo = substr($Url,0,$Stop); $Start = index($Url,"//") + 2; $Dominio = substr($Url,$Start); $Stop = index($Dominio,"/"); $Dominio = substr($Dominio,0,$Stop); $Start = rindex($Url,"/") + 1; $NomeArq = substr($Url,$Start); $Compr_Url = length($Url); print "O protocolo utilizado pelo endereço da URL é: ", $Protocolo, "\n"; print "O domínio da URL é: ", $Dominio, "\n"; print "O nome do arquivo da URL é: ", $NomeArq, "\n"; print "O endereço URL tem um comprimento de ", $Compr_Url, " caracteres\n";

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.

info 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:

#!/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;.


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:

#!/usr/bin/perl $Texto = "Zé corre risco de vida num táxi todo escangalhado 1234567890"; $Texto =~ s/[a-z]| //gi; print $Texto;

Exemplo 2 - Substituir caracteres especiais por compatíveis com HTML:

#!/usr/bin/perl $Texto = "O coração brasileiro é grande, incômodo para carregar mas próprio para grandes emoções"; $Texto =~ s/ç/\ç\;/g; $Texto =~ s/ã/\ã\;/g; $Texto =~ s/é/\é\;/g; $Texto =~ s/ô/\ô\;/g; $Texto =~ s/ó/\ó\;/g; $Text =~ s/õ/\õ\;/g; print $Texto;

Exemplo 3 - Eliminar e bloquear erros:

#!/usr/bin/perl @NotasEscolares = (1,4,7,2,X,3,0,1,6,3,1,8,R,G,9,2,3,4,1,1,3); $CadeiaDeNotas = join(",",@NotasEscolares); $CadeiaDeNotas =~ s/[7-9]|0|[A-Z]//gi; @NovasNotas = split(/,|,,/,$CadeiaDeNotas); for(@NovasNotas) { unless($_ eq "") { print $_, "\n"; } }

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.

mfx brokerкисти для тенейотзывы полигонлучшие игрыпродвижение сайта недорогоmfx broker отзывы трейдеровлобановский класс