[Rio-pm] Quem tem mais incremento em 2008 ?!?!

Fernando Oliveira fernandocorrea em gmail.com
Quinta Setembro 11 07:55:01 PDT 2008


Já tá na hora do golf? :)

2008/9/11 Alexei Znamensky <russoz em gmail.com>

> Mantovani,
>
> Tem algumas melhorias a sugerir. Você não fechou o arquivo que abriu, e
> carregar o arquivo inteiro num vetor não é exatamente algo bom, e no seu
> caso, é completamente desnecessário. Se voce nao está na lista Cascavel-pm,
> entre, e olhe nos archives, tem um email do Nilson Santos Figueiredo Júnior,
> de ontem, que fala sobre a boa prática para abrir arquivos.
>
> Então, vou primeiro passar o parte de mexer com arquivo, não vou nem olhar
> o resto.
>
> -------------- original --------------
> open(ARQ,"<2008q3.txt");
> my @arquivo = <ARQ>;
> my @more = ();
> foreach (@arquivo){
> my @more = unshift(@more,$1) if $_=~ /(\w{4,}\S+)\+\+/g
> }
> -------------- original --------------
>
> isso deveria, no mínimo, ser escrito assim:
>
> ----- v1 -----
> open my $arq, "<", "2008q3.txt" or die "Can't open 2008q3.txt";
>
> my @arquivo = <$arq>;
> my @more = ();
> foreach (@arquivo){
> my @more = unshift(@more,$1) if $_=~ /(\w{4,}\S+)\+\+/g
> }
> close $arq;
> ----- v1 -----
>
> mas como eu te disse, carregar o arquivo no vetor (leia-se memória) é um
> desperdício de recursos, você só quer dar uma "passada" no conteúdo, então:
>
> ----- v2 -----
> open my $arq, "<", "2008q3.txt" or die "Can't open 2008q3.txt";
>
> my @arquivo = <$arq>;
> my @more = ();
> while( <$arq> ) {
>    @more = unshift(@more,$1) if $_=~ /(\w{4,}\S+)\+\+/g;
> }
> close $arq;
> ----- v2 -----
>
> Vamos olha para a linha dentro do loop agora. O unshift já modifica o
> vetor, você não precisa atribuir de volta. Se você está trabalhando com a
> variável $_, você pode "sumir" com ela. Além disso, você colocou "my @more"
> dentro e fora do loop, o que faz com que existam duas variáveis @more, uma
> em cada escopo. Então:
>
> ----- v3 -----
> open my $arq, "<", "2008q3.txt" or die "Can't open 2008q3.txt";
>
> my @arquivo = <$arq>;
> my @more = ();
> while( <$arq> ) {
>    unshift( @more, $1 ) if /(\w{4,}\S+)\+\+/g;
> }
> close $arq;
> ----- v3 -----
>
> Agora uma melhoria: não seria muito  mais legal se você pudesse fazer esse
> script funcionar com qualquer nome de arquivo? Você poderia executá-lo
> assim: "quemtemmais 2008q4.txt" e ele já ia ler o arquivo especificado na
> linha de comando. Para isso, simplificamos ainda mais:
>
> ----- v4 -----
> my @more = ();
> while( <> ) {
>    unshift( @more, $1 ) if /(\w{4,}\S+)\+\+/g;
> }
> ----- v4 -----
> v4->explicacao: se você usa o while( <> ), chamado de operador "diamante",
> sem um descritor de arquivo, o perl irá: 1) caso haja parâmetros na linha de
> comando ele irá tentar abrí-los como arquivos e irá ler deles ou; 2) irá ler
> da entrada padrão, permitindo que você use o seu script com pipe, por
> exemplo "cat 2007.txt 2008.txt | quemtemmais". O que simplifica bastante a
> sua vida ;-)
>
> Provavelmente dá para melhorar mais, como por exemplo ao invés de fazer
> dois loops que passam pelo arquivo inteiro, fazer um loop só que executa as
> duas operações já de uma vez.
>
> Mas popopor enquanto é só, pepepessoal.
>
> []s
> Russo
>
> 2008/9/11 Daniel de Oliveira Mantovani <
> daniel.oliveira.mantovani em gmail.com>
>
>> Quem tem mais incremento em 2008 ?!?!
>> hehe
>> O Fernando me passou um desafio para ver quantos ++ cada um tem, o Eden^^
>> e o Blabos^^ me ajudaram.
>> wget http://mail.pm.org/pipermail/rio-pm/2008q3.txt
>>
>> depois
>>
>> #!/usr/bin/perl
>>
>> use strict;
>> use warnings;
>> open(ARQ,"<2008q3.txt");
>> my @arquivo = <ARQ>;
>> my @more = ();
>> foreach (@arquivo){
>> my @more = unshift(@more,$1) if $_=~ /(\w{4,}\S+)\+\+/g
>> }
>> for (0 .. scalar(@more) -1){
>> $more[$_] =~ s/\s.*//
>> }
>> my %hash;
>> $hash{$_}++ for @more;
>> print "$_ = $hash{$_}\n" for keys %hash
>>
>> --
>> Daniel de Oliveira Mantovani
>> "A sede pelo aprendizado é insaciável"
>> http://mantovanihouse.blogspot.com/
>> ------------------------------------------------------------
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>
>
>
> --
> Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
> www.flickr.com/photos/alexeiz]
> "Though we live in trying times, we're the ones who have to try"
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
Just another Perl Hacker,
Fernando (SmokeMachine)
http://perl-e.org
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20080911/9e22e73e/attachment.html>


Mais detalhes sobre a lista de discussão Rio-pm