[SP-pm] Melhor forma para...

Nelson Ferraz nferraz at gmail.com
Tue Jul 16 08:21:46 PDT 2013


Eu recomendo seguir a filosofia unix: leia de STDIN e escreva para STDOUT.

Por que isso é melhor? Porque torna o seu script genérico; ele passa a
funcionar para qualquer arquivo de entrada e saída, além daqueles que você
tinha planejado inicialmente.

Exemplo:

Você poderia executar o programa da seguinte forma:

    ./count.pl input.txt > output.txt

Para ordenar a saída você pode usar o comando "sort" do unix:

    ./count.pl input.txt | sort > output.txt

Para testar o programa, você pode usar o comando head, que lê apenas as
primeiras linhas de um arquivo:

    head input.txt | ./count.pl

Aqui vai o código de exemplo (não testado):

#!/usr/bin/perl

use strict;
use warnings;

my %count = ();
while (my $line = <>) {
  for my $letter (qw /A C G T/) {
    $count{$letter} += ( () = $line =~ /$letter/g );
  }
}

print "$_\t$nucleotides{$_}\n" for sort keys %nucleotides;

__END__


Os pontos mais importantes a retirar do código acima:

1) Leia usando o "operador diamante" (<>)
2) Escreva usando "print"
3) Deixe para o usuário decidir os nomes dos arquivos de entrada e saída

[]s

Nelson



Em 16 de julho de 2013 16:43, Blabos de Blebe <blabos em gmail.com> escreveu:

> Opa,
>
> Duas coisas. Na verdade três.
>
> Seu código tá até bem limpo, seguindo algumas boas práticas até.
>
> ...
>
> Mas pode melhorar :)
>
> Não use bareword para descritor de arquivo, use uma variável. Para lhe
> apontar a documentação correta "I summon garu".
>
> open my $fh, '<', 'filename.txt' or die 'Cannot open';
>
> Parêntesis em Perl são opcionais em alguns casos, sendo que usar ou não
> usar muitas vezes é questão de estilo. Em alguns outros casos são
> obrigatórios. Na dúvida, use.
>
> ...
>
> Para imprimir hash com elementos em ordem, eu gosto e usar *slice* ao
> invés de loop.
>
> my %hash = ( etc => 1, bar => 3, foo => 5)
> my @order = qw{ foo bar etc };
> my @ordered_values = @{hash}{ @order };  ## Slice. Chaves a mais de
> propósito.
> print join( ';', @ordered_values );
>
> Você pode usar o sort por chave:
> my @order = sort { $a cmp $b} keys %hash;
>
> Note que @order = sort { $a <=> $b} keys %hash;
> Não funciona.
>
> Ou a forma mais curta:
> @order = sort keys %hash;
>
> Ordenando por valor decrescente
> @order = sort { $hash{$b} <=> $hash{$a}} keys %hash;
>
> Novamente, @order = sort { $hash{$b} cmp $hash{$a}} keys %hash;
> Não funciona.
>
>
> ...
>
> Talvez, se o objetivo for só contar e mais nada, usar expressão regular
> pode ser mais rápido, mas como regexp está fora dos meus domínios então
> posso estar errado.
>
> Mede aí e depois conta...
>
>
> []'s
>
>
>
> 2013/7/15 Renato Santos <renato.cron em gmail.com>
>
>> Acredito que não há motivos para não utilizar o *for *nesse caso,
>>
>> até porque, não parece ter muitas outras soluções,
>>
>> se for pra deixar o codigo menor, ficará menos legivel. se for pra
>> aumentar a velocidade, você pode reescrever em alguma linguagem compilada,
>> tipo C, só que vai dar mais trabalho!
>>
>>
>> 2013/7/15 Rafael Silveira <dev.silveira em yahoo.com>
>>
>>>  Boa noite Renato.
>>>
>>> Na verdade, não importa não!
>>> Mas, eu gostaria de fazer da melhor forma possível, inclusive evitar
>>>  usar outro for.
>>> Estava pensando em fazer algo parecido, porém salvar num array, e mandar
>>> pro arquivo com um join(' ', $var).
>>>
>>> Mas mesmo assim utilizaria o for.
>>>
>>> Muito obrigado a todos! :D
>>>
>>> []'s
>>>
>>> =begin disclaimer
>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>> =end disclaimer
>>>
>>>
>>
>>
>> --
>> Saravá,
>> Renato CRON
>> http://www.renatocron.com/blog/
>> @renato_cron <http://twitter.com/#!/renato_cron>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>


-- 
Nelson Ferraz
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130716/09e34f21/attachment-0001.html>


More information about the SaoPaulo-pm mailing list