[SP-pm] ER para separar o primeiro e o último campo de um registro.

Nelson Ferraz nferraz at gmail.com
Mon Dec 22 11:32:33 PST 2008


2008/12/22 Wagner Arbex <arbex em arbex.pro.br>:
> O que eu preciso é ler esse arquivo e separar o primeiro e o último
> campo para gravá-los em outro arquivo, seria +-
>
> while ( <ARQ1> ) {
>   chomp;
>
>   my $primeiro = $_;
>   $primeiro =~ s/\s.*//;  # OK... esse funciona.
>
>   my $ultimo = $_;
>   $ultimo =~ s/.*\s.+$//; # Bom, aqui eu não sei qual a ER a ser usada.
>
>   print ARQ2 "$primeiro,$ultimo\n";
> }
>
> Além de me ajudarem com a ER, todas as sugestões para eu melhorar o
> código, conhecer novas estruturas, formas de fazer etc são muito bem vindas.

Parece que você mesmo encontrou a solução para o problema, no segundo
email. Parabéns!

Gostaria apenas de sugerir uma modificação para tornar o seu programa
mais genérico:

while ( $line = <> ) {
    my ($f1, $f2) = $line =~ /^ (\d+) .*? (\d+) $/x;
    print "$1,$2\n";
}

Observe que, ao invés de abrir dois filehandles (ARQ1 e ARQ2), eu
preferi usar o operador diamante ( <> ), que permite que o seu arquivo
de entrada possa ser aberto assim:

   programa.pl arquivo-entrada.txt

Isso vai imprimir a saída na tela. Mas você pode redirecionar a saída
para um arquivo:

   programa.pl arquivo-entrada.txt > arquivo-saida.txt

A vantagem é que, com isso, seu programa funciona como um filtro. Você
pode encadeá-lo com outros programas, como por exemplo:

    programa.pl arquivo-entrada.txt | sort | uniq > arquivo-saida.txt

Ou:

    find . -name '*.txt' | programa.pl  | sort | uniq > arquivo-saida.txt

Esta é a filosofia Unix: escreva programas pequenos, que façam apenas
uma coisa bem, e o façam bem.


More information about the SaoPaulo-pm mailing list