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

Alexei Znamensky russoz em gmail.com
Quinta Setembro 11 07:43:50 PDT 2008


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"
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20080911/e7a02916/attachment-0001.html>


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