Leia os artigos anteriores:
Expressões regulares em Perl – Parte 01
Expressões regulares em Perl – Parte 02
*
Continuando a falar sobre expressões regulares em Perl, vou mostrar alguns trechos de códigos interessantes, comentando partes novas e que podem ser de grande utilidade num projeto da vida real, que podem tornar eficientes atividades que sejam repetitivas ou ainda que um script agendado poderia facilmente fazer.
# Abre o arquivo teste.txt para leitura
open (ARQUIVO, "</home/usuario/teste.txt");
while ($linha = <ARQUIVO>) {
print $linha if ($linha =~ /^Fala1/);
}
# Fecha a referência para teste.txt
close ARQUIVO;
Nesse primeiro esboço, abre-se uma referência para um arquivo no sistema operacional para somente leitura (ser somente leitura é indicado pelo símbolo “<“, caso fosse para escrita, seria o símbolo “>”). Em seguida, é feita uma repetição recuperando cada uma das linhas do arquivo e armazenando o seu conteúdo em $linha.
No corpo da repetição, uma maneira alternativa de se escrever um bloco if, onde a condição vai depois do resultado caso ela seja verdade, que no caso é imprimir a linha caso ela comece com o termo “Fala1”. Ao final, fecha-se a referência para que o recurso seja liberado (se tivesse sido aberto para escrita, o fechamento explícito garante o salvamento dos dados em disco).
O mesmo trecho acima poderia ser reescrito como:
# Abre o arquivo teste.txt para leitura
open (ARQUIVO, "</home/usuario/teste.txt");
while (<ARQUIVO>) {
print if (/^Fala1/);
}
# Fecha a referência para teste.txt
close ARQUIVO;
Repare que a sintaxe é muito mais enxuta (e esconde muitos mais detalhes) quando se faz uso da variável especial $_ que neste caso está no lugar da variável $linha. Um outro exemplo muito útil é o que segue:
# recupera os pedacos de uma hora
$tempo = localtime(time());
$tempo =~ /(\d\d):(\d\d):(\d\d)/;
$hor = $1;
$min = $2;
$seg = $3;
Nesse exemplo, o operador () é usado para agrupar pedaços de string que serão colocadas em variáveis separadas, o que chega próximo ao comportamento de uma máscara de dados. Caso o conteúdo da variável $tempo case com a expressão regular no formato informado HH:MM:SS, a linguagem gera automaticamente as variáveis $1, $2 e $3 com os valores casados entre parênteses e que serão usadas como uma variável regular. Outra maneira de escrever o mesmo código acima:
$tempo = localtime(time());
($hor, $min, $seg) = ($tempo =~ /(\d\d):(\d\d):(\d\d)/);
Usando o operador de listas (que também são os parênteses), os valores são passados automaticamente para as variáveis de destino, economizando alguns trechos de código que podem tornar o código mais extenso e menos legível.
Esses e muitos outros exemplos podem ser vistos em dois excelentes tutoriais da linguagem Perl sendo usada com expressões regulares:
- perlrequick – Perl regular expressions quick start (http://perldoc.perl.org/perlrequick.html)
- Perl regular expressions tutorial (http://perldoc.perl.org/perlretut.html)
Eles são em inglês mas possuem uma linguagem fácil e os exemplos falam por si só. Vale muito como um primeiro mergulho no tópico ou mesmo um aprofundamento, pois os últimos tópicos de cada um deles não são triviais.