[Golf, Again!]: Re: [Cascavel-pm] Re: Acronismos, Neologismos e Corruptelas...

Luis Campos de Carvalho lechamps em terra.com.br
Terça Setembro 16 13:39:10 CDT 2003


Rodolfo Sikora wrote:
> Cara, vocês são estranhos! ;)
> 
> Já que vocês gostam, vamos lá qual seria a melhor forma de otimizar esta regexp.
> 
> $snipTmpl =~ s/IWMS\((\S+?)\)\s*(.+?)\s*EndS\(\S+?\)/$hash{$1}=$2/gesi;
> 

   Vamos começar torto (calma, que eu explico!):
   Você deveria reescrever esta expressão assim:

   while( $snipTmpl =~ qr/IWMS\([^\)]+\)\s+(\S+)\s+EndS\(([^\)]+)\)/g ){
     $hash{$1}=$2;
   }

   Evite usar as opções '/i', '/e' e '/s', que causam slowdown na 
/regular/ /expression/ /engine/ do perl.

> Ela serve para pegar um arquivo grande deste tipo:
> IWMS(teste)
> paradas
> EndS(teste)
> 
> IWMS(teste2)
> paradas2
> EndS(teste2)
> 
> e colocar num hash tipo: $hash{teste2}="paradas2";

   Bom, com estas informações, muda tudo de figura.
   Você está carregando um arquivo enorme em memória apenas para poder 
bater uma expressão regular contra ele, mas deveria usar assim:

__BEGIN_PERL__
#!/usr/bin/perl
use strict;
use warnings;
my( $name, $thing, %hash );
while ( <DATA> ) {
   next if /^\s*$/;
   $name = $1 if /^IWMS\(([^\)]+)\)/;
   undef $name if /^EndS\($name\)/;
   $hash{ $name } = $1 if defined $name && /^(\S+)$/;
}
__END_PERL__

   Vantagens? O footprint de memória disso aqui é ridículo - eu carrego 
apenas uma linha (12-18 bytes, no máximo) de cada vez; Posso ler de 
pipelines, basta usar '<>' ou '<STDIN>' no loop; não tenho problemas com 
o tamanho do arquivo, tenho dados de saída instantâneos, se eu quiser 
(basta dar print ao invés de armazenar em hash); é muito mais rápido de 
implementar, ler, entender e documentar; até o estagiário consegue dar 
manutenção (otimizado para velocidade e legibilidade, coisa rara de 
conseguir ao mesmo tempo!).

> Estou curioso para ver a arte ninja que vai resultar esta parada.

   Ahahah... "arte ninja..." essa é boa... ahahaha...

> ps.: Sou um fã de perl e uso ele 90% nas coisas q eu faço, mas estou
 > longe se ser um ninja do apocalipse final que corta cabeças, talvez
 > por isto as coisas que eu faço nem sempre são rápidas e comem
 > bastante memória.

   =-] nem esquenta.
   É como falar $sua_lingua_preferida, você aprende e fala cada vez 
melhor quanto mais usar. Tenho certeza de que você vai ser um grande 
ninja do apocalipse em breve...

> Outra pergunta seria o seguinte: Porque eu deveria usar mod_perl e
 > não usar fast_cgi, ou melhor um comparativo entre ambos.
> Nunca usei modperl, sempre usei mod_fastcgi.

   Bom, para isso, nada como a resposta do São Glock(1), em outro email 
para a lista. Eu nem me atrevo a completar nada... Salve, São Glock! =-]

   Putamplexos!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
   Luis Campos de Carvalho is Computer Scientist,
   PerlMonk [SiteDocClan], Cascavel-pm Moderator,
   Unix Sys Admin && Certified Oracle DBA
   http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Notas:
   1. "São Glock" é o honroso título do Professor Flávio S. Glock, Perl 
Monk Saint:

   http://www.perlmonks.org/index.pl?node_id=173932




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