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.