[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