[Cascavel-pm] Manipulação de arquivo
Luis Motta Campos
luismottacampos em yahoo.co.uk
Quarta Outubro 25 08:56:44 PDT 2006
Diego Mendes Teixeira wrote:
> Ok, quero muito sua ajuda... Te chamei de "CARINHA" porque foi assim que
> você se referiu a mim no primeiro email. Vou postar o codigo dos 2
> programas que fiz. O primeiro, usando expressao regular esta
> funcionando, o outro usando armazenamento dinamico em heap está
> imprimindo todas as linhas do arquivo, mesmo nao achando a palavra
> pesquisada. Estou na correria pra fazer esse trabalho, visto que tenho
> que entregar quinta-feira agora.
Vamos ver. Parece que você tem problemas com a sua busca exata em Perl
baseada em expressões regulares. Aqui tem a minha implementação. Eu
estou tentando ser didático, então isto está muito grande ainda para o
meu gosto, mas paciência.
Eu vou escrever mais, te mando em seguida.
#!perl # Emacs, this is -*- perl -*-
use strict;
use warnings;
##############################
# Expressões Regulares em Perl
# Busca exata
##############################
### Argumentos vêem sempre em @ARGV.
### ARRAYS INICIAM COM ZERO: $ARGV[0] é o primeiro elemento.
# Isto testa para saber se $ARGV[0] (primeiro argumento) é uma palavra
# com apenas letras maiúsculas e minúsculas.
if( $ARGV[0] !~ m{[a-zA-Z]} ){
print qq{Programa de busca de palavras exata em Perl com expressões
regulares\nUso: $0 <palavra> <nome_arquivo>\n\n};
die "Palavra para busca pode conter apenas letras maiúsculas e
minúsculas\n";
}
# Sanidade mental: arquivo existe?
die "Erro: arquivo para busca não encontrado.\n" unless -f $ARGV[1];
# Chegar aqui quer dizer que o arquivo existe. Abre e olha dentro.
open FILE, $ARGV[1] or die "Erro abrindo arquivo: $!\n";
# Contadores: de linha, de ocorrências
my ( $line_counter, $instance_counter );
# Loop de busca da palavra.
while( <FILE> ){
$line_counter++;
# Chomp remove um caracter "\n" no final da linha, se houver.
chomp;
if( m{\b\Q$ARGV[0]\E\b} ){
$instance_counter++;
print "$line_counter: $_\n";
}
}
close FILE or die "Erro fechando arquivo: $!\n";
print "Encontradas $instance_counter ocorrências da palavra '$ARGV[0]'
no arquivo '$ARGV[1]'.\n";
__END__
--
Luis Motta Campos
Senior System Engineer at Segula.FR
Hobbyist Cooker and Photograph
Mais detalhes sobre a lista de discussão Cascavel-pm