Back-End

27 ago, 2009

Expressões regulares em Perl – Parte 02

Publicidade

Confira o artigo anterior:

Expressões regulares em Perl – Parte 01

*

Depois de um longo período distante (não duvidem como a escrita de uma dissertação junto de um trabalho em tempo integral podem consumir uma pessoa…), volto para escrever um pouco mais sobre expressões regulares no contexto da linguagem Perl. Como a funcionalidade é quase nativa nela, tudo fica mais fácil, principalmente quando comparado com o mesmo recurso em outras linguagens de programação e o objetivo deste artigo é mostrar alguns trechos de código usando o recurso de substituição.

sub trim {
my ($param) = @_;
$param =~ s/^\\s+//;
$param =~ s/\\s+$//;

return $param;
}

Em outras linguagens, existem funções que removem espaços em branco (ou outros caracteres de tabulação) do começo e do fim de uma string qualquer. É a famosa função trim, que em Perl não existe de forma nativa. A implementação acima mostra a criação de uma função que recebe um parâmetro para, em seguida, remover todos os espaços do começo e depois todos os espaços do fim. Lembrando que o operador =~ faz a operação no conteúdo da variável e reatribui o valor modificado nela mesma.

O símbolo ^ faz com que o casamento aconteça apenas no início da string e o símbolo $ faz o equivalente para o final, ou seja, se a expressão terminar com o conjunto definido. O meta-caractere \\s é um atalho para indicar espaço em branco tabulações (como \\t \\n) e, por fim, o símbolo + indica que o casamento deve acontecer se existir um ou mais caracteres daquele tipo. De certa forma, tudo isso já havia sido mencionado no artigo anterior.

O que deve ser mais novo é o operador s///, que indica que a string casada entre as duas primeiras barras deve ser trocada pelo conteúdo que estiver entre a segunda e terceira. Como não existe esse conteúdo, os espaços são trocados por vazio! Essa lógica pode ser aplicada para qualquer troca de caracteres, a remoção de espaço é apenas um exemplo bastante usado. Esse operador possui uma grande flexibilidade no momento em que é usado com alguns caracteres especiais que o modificam. Por exemplo:

sub troca_todos {
my ($param, $busca, $troca) = @_;

$param =~ s/$busca/$troca/gi;

return $param;

}

Essa função troca_todos recebe três argumentos: uma string qualquer, um string de busca e uma de troca, sendo que o objetivo dela é trocar todas as ocorrências de $busca pelo valor contido em $troca na variável $param. Os primeiros operadores =~ e s/// já são conhecidos e fazem com que a aplicação da expressão regular aconteça diretamente na variável em questão, trocando valores. A diferença fica por conta dos termos g e i.

Eles são modificadores (existe uma série deles) que modificam o comportamento padrão do funcionamento da expressão regular. Neste caso, o “g” significa “guloso”, que quer dizer “aplique a troca para todas as ocorrências da expressão”. Já o “i” significa independente de casa, ou seja, maiúsculas e minúsculas não fazem diferença, sendo todas interpretadas da mesma forma.

Espero que a motivação do uso do operador s/// tenha ficado clara e demonstrado ao menos um pouco o poder e a flexibilidade que ele pode trazer no uso de expressões regulares em Perl.