Coluna de arquivo para array

Publicado por fernando em 20/03/2008

[ Hits: 7.474 ]

 


Coluna de arquivo para array



Este artigo foi retirado do blog perl-e: Perl pra quem tem pressa e explica como transformar um script que lê um arquivo e transforma a sua primeira linha num array, num one-liner. Mais informações sobre one-liners, no link acima.

Coluna de arquivo para array

Ontem, um cara na Rio.PM mandou uma pegunta que eu acho que é um bom material para um primeiro post técnico. Ele perguntou como faria para transformar a primeira coluna de um arquivo em um array. O arquivo seguia esse formato:

63528 Algum Nome
537728 Outro Nome
645374 Fulano De Tal
637485 Beltrano Alvarenga

Ele reclama que não conseguia fazer pegar o primeiro número sem o espaço. Então suponho que ele estivesse fazendo algo tipo isso:

#!/usr/bin/perl
open $FILE, $ARGV[0];
while(<$FILE>) {
$numero = $1 if /^(.{6})/; # não faça isso!!!
push @array, $numero;
}
print "@array$/";

Daria certo se ele tivesse feito:

/^(\d+)/

ao invés de:

/^(.{6})/

Esta é uma forma, mas eu ainda preferiria que ele tivesse feito assim:

#!/usr/bin/perl
open $FILE, shift;
while(<$FILE>) {
push @array, (split /\s+/)[0];
}
print "@array$/";

Bom, vamos transformar isso num one-liner?

1o:

perl -e 'open $FILE, shift; while(<$FILE>) {push @array, (split
/\s+/)[0]}print "@array$/"' arq.txt


2o: o open é desnecessário já que o diamante (<>) já faz esse trabalho para a gente:

# perl -e 'while(<>) {push @array, (split /\s+/)[0]}print "@array$/"' arq.txt

3o: na verdade a gente pode substituir o while (<>){} por uma única letra:

# perl -ne 'push @array, (split /\s+/)[0];END{print "@array$/"}' arq.txt

O -n pega todo o código passado e põe dentro do while então temos que usar o bloco END para que o print seja executado só no final.

4o: e o split pode ser diminuído também.

# perl -nae 'push @array, $F[0];END{print "@array$/"}' arq.txt

O -a faz o auto-split, e joga os valores dentro do array @F.

5o: o $/ no print é só para ficar bonitinho, quebrar uma linha depois do print do array, mas podemos diminuir isso também:

# perl -nale 'push @array, $F[0];END{print "@array"}' arq.txt

O -l faz com q todo o print já imprima uma quebra de linha automaticamente.

Já está bom? Ainda tem mais um maceteie para ganharmos mais quatro caracteres:

# perl -nale 'push @array, $F[0]}{print "@array"' arq.txt

Como eu disse, o -n inclui um while(<>){...}, então, quando fechamos o }, estamos fechando este while, e quando abrimos o { estamos criando um bloco só com o print.

Então no final, o programa e a saída ficam assim:

$ perl -nale 'push @array, $F[0]}{print "@array"' arq.txt
63528 537728 645374 637485

Espero que vocês tenham gostado...

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Instalando impressora Canon PIXMA iP1700

Como criar atalhos na Área de Trabalho do Ubuntu

FFmpeg - Como inserir Logo em vídeo

Configurando Hugepages

Compiz no Debian Squeeze - Instalação em notebook Probook 4320s Intel i915

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts