[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