Coluna de arquivo para array

Publicado por fernando em 20/03/2008

[ Hits: 7.358 ]

 


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

Como trocar chave de segurança entre servidores

Erro no Aireplay-ng : mon0 is on channel -1, but the AP uses channel X

Ajude sua distro: faça download via torrent

Squid + DansGuardian + Webmin no CentOS 6.6

Fedora Core 6 - aiglx com o Beryl

  

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