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...
Nenhum comentário foi encontrado.