 |
Roteiro do Módulo:
Manipulação de Cadeias de Caracteres e Listas
Extraindo partes de strings
Transformando strings em listas
Concatenando elementos de lista em strings
Inserindo, substituindo e eliminando elementos de listas
Ordenando elementos de listas
Procurando e substituindo caracteres ou strings |
Extraindo partes de strings
|
Pode-se extrair uma sequência de caracteres ou um único caracter de uma sequência de caracteres (string) maior.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";
No exemplo acima, extrai-se de um endereço URL, atribuído à escalar $Url, o protocolo (no exemplo: http), o domínio (no exemplo: www.numaboa.com) e o nome do arquivo (no exemplo: index.html). Todas as três partes são atribuídas a escalares próprias. O protocolo está em $Protocolo, o endereço do 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 (= subcadeia). Esta função possui dois ou três argumentos que devem ser passados como parâmetros. O primeiro parâmetro é a cadeia de caracteres da qual a sequência de caracteres deve ser extraída. O segundo parâmetro é um número. Este número indica à partir de qual caracter da string a sub-string deve ser extraída. O primeiro caracter 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. Qunado se quer, como no exemplo, extrair o domínio de uma URL, sabe-se que o endereço do domínio se inicia logo após as duas barras //. 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 caracter ou cadeia 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 dessas funções a escalares próprias, como no exemplo acima. Estas escalares podem ser confortavelmente retrabalhadas posteriormente.
Observações: Outra função interessante para cadeias de caracteres é a length (length = comprimento) (veja o exemplo). Esta função retorna o número de caracteres que compõem uma cadeia. |
Transformando strings em listas
|
Quanto se tem cadeias de caracteres que contenham caracteres específicos de ocorrência habitual, pode-se tratar estes caracteres como delimitadores e transferir as cadeias de caracteres para uma lista. Exemplo:
#!/usr/bin/perl
$CSV_Linha = "Maria Vaz Soura,Rua do Sobe e Desce 13,86600-000 Curralinho";
@Endereco = split(/,/,$CSV_Linha,3);
$i = 0;
for(@Endereco) {
print $i+1, ". Campo do Endereço: ", $Endereco[$i], "\n";
$i++;
}
No exemplo acima, a escalar $CVS_Linha contém uma linha típica de um arquivo delimitado 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 terminaçã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 acima referida escalar $CVS_Linha.
Utilizando-se a função Perl split (split = rachar, separar), pode-se separar o conteúdo em campos e armazená-los numa lista. Define-se uma lista, como a lista @Enderecos no exemplo acima, à qual se atribui os valores de retorno da função split. A função split possui dois argumentos, opcionalmente também 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 cadeia de dados (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 acima, o terceiro parâmetro não seria necessário - consta apenas para apresentar integralmente a função. |
Concatenando elementos de lista em strings
|
Pode-se criar uma cadeia de caracteres utilizando-se os elementos de uma lista. Exemplo:
#!/usr/bin/perl
@Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Curralinho");
$CSV_Linha = join(",",@Endereco);
print "A string gerada é: ", $CSV_Linha, "\n";
No exemplo acima atribuiu-se um endereço à lista @Endereco, com campos para cada dado. Esta lista pode ser transformada numa cadeia de caracteres com a ajuda da função Perl join e qual o caracter (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 do exemplo acima, à qual é atribuído o valor de retorno da função join. Esta função possui dois argumentos. O primeiro aguarda como parâmetro o caracter (ou caracteres) delimitador que servirá como elemento de separação. No exemplo, apenas uma vírgula. O segundo aguarda como parâmetro uma lista que fornecerá os elementos que comporão a cadeia de caracteres. No exemplo, a lista é @Endereco. |
Inserindo, substituindo e eliminando elementos de listas
|
As listas não precisam ter um conteúdo homogêneo nem um comprimento fixo. Elas podem, por exemplo, durante a execução de um programa, aumentar ou diminuir o seu número de elementos.
Exemplo 1 - Inserir um elemento:
#!/usr/bin/perl
@Endereco = ("Maria Vaz Soura","Rua do Sobe e Desce 13","86600-000 Curralinho");
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 Curralinho");
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 Curralinho");
$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 Curralinho");
for($i=1;$i<3;$i++) {
$Temp = shift(@Endereco);
push(@Endereco,$Temp);
}
for(@Endereco) {
print $_, "\n";
}
Com a ajuda da função Perl push pode-se adicionar um novo elemento a uma lista. No exemplo 1 acima, 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á adicionado um ou mais elementos. Como segundo parâmetro, o(s) elemento(s) que serão inseridos na lista. Estes podem ser cadeias de caracteres ou números. Quando se pretende adicionar mais de um elemento, os mesmos deverão ser separados por vírgula.
A contrabarra que se vê no endereço de e-mail não pertence a este endereço. É apenas uma máscara para a arroba @, uma vez que este caracter 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 isso, é indicada a função shift. Esta função elimina o primeiro elemento de uma lista e 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 uma alça-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 função poderosa da Perl é a capacidade de ordenar listas.
Exemplo 1 - Ordenando strings:
#!/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 Perl 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 acima - 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, do exemplo 2, 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 descendente, pode-se usar a função Perl reverse. No exemplo 2, após obter a lista @ListaOrdenada ordenada em ordem ascendente, a mesma é ordenada em @Decrescente através da diretiva @Decrescente = reverse @ListaOrdenada; na ordem descendente. |
Procurando e substituindo caracteres ou strings
|
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 = "João corre risco de vida num taxi 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 realizaçõ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 é: String =~ s/PadraoBusca/PadraoSubstituicao/[Opcoes]
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, segue-se 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 (normalmente, apenas a primeira ocorrência é substituída)
i busca/procura letras independente da caixa, tanto as minúsculas quanto as maiúsculas (normalmente uma letra minúscula é considerada diferente da sua versão maiúscula)
No exemplo 1 acima, 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.
|
| Todos os scripts CGI deste site são "made in Aldeia". As linguagens utilizadas são principalmente PHP e alguma coisa em Perl. Faça contato: tire dúvidas, solicite matérias, critique e contribua. |
|