Coluna de arquivo para array

Publicado por fernando em 20/03/2008

[ Hits: 7.519 ]

 


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

Servidor DHCP no Debian 7

O porquê de se usar software livre

Configurando rota para endereço multicast

Named Pipe (First in First out) FIFO

Linux no MAC G3

  

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