[Cascavel-pm] Quando usar Gramatica e quando usar Regexp? [Was: Artigo - Como Perl Salvou o Projeto Genoma]

Luis Motta Campos luismottacampos em yahoo.co.uk
Quinta Maio 24 07:25:08 PDT 2007


On May 24, 2007, at 4:07 PM, Lorn wrote:
> Eu nunca precisei fazer nenhum parse de html ( sim, eu uso modulos  
> que fazem parser de html, mas existem html's que dão medo, então  
> não é sempre que o modulo resolve ) ou qualquer tipo de arquivo,  
> tão complexo que seria melhor que fosse feito uma gramatica, mas  
> talvez eu tenha perdido 5h fazendo regexp, quando podia ter perdido  
> 1h fazendo uma gramatica, tem como descobrir quando usar Gramatica  
> e quando usar Regexp? alguma tecnica? :P

   Sim, tem uma ótima técnica para saber quando fazer parse de dados  
com REGEXP. Vou descrever o algorítimo de decisão com perl, para  
ficar formal:

   # Aceita um inteiro positivo representando o comprimento dos dados  
em bytes,
   # retorna um boolean indicando quando usar REs em parsing
   sub when_to_use_regexp_for_parsing {
       my ( $data_lenght ) = @_;
       return $data_lenght =< 75; # nunca em mais de uma linha de dados.
   }

   Se bem que eu prefiro usar esta aqui:

   sub when_to_use_regexp_for_parsing {
       my ( $data_lenght ) = @_;
       return undef;
   }

   De forma geral, se você conhece um pouco de Flex, Lex ou alguma  
coisa parecida, consegue escrever gramáticas para este tipo de coisa  
muito depressa, adaptando de uma existente.

   Eu, particularmente, escrevi gramáticas apenas uma vez na vida,  
quando me pediram para implementar um Módulo do Apache capaz de fazer  
Proxy por Reescrita.

   Um proxy por reescrita trabalha reescrevendo uma página HTML  
qualquer, solicitada pelo cliente, de forma que todos os links voltem  
a passar pelo meu webserver, e enviando esta versão para o cliente.

   Funciona mais ou menos assim: o cliente envia uma requisição para  
o google (URL-encoding omitido das urls para facilitar a leitura):

   http://rewriting.proxy.com/?http://www.google.com/

   O Proxy instancia um LWP::UserAgent (ou pega um do /pool/) e puxa  
a página do Google, que tem todas as suas url's reescritas para  
apontar para o http://rewriting.proxy.com/, e envia esta página  
"reescrita" para o cliente.

   O Proxy tem de administrar cookies para cada sessão (e não  
misturar os cookies), e controlar quem-viu-o-que-e-vai-para-onde.  
Normalmente, um bom mecanismo de sessões transparentes resolve o  
problema.

   Das outras vezes em que precisei fazer isso nos últimos 10 anos,  
eu usei XML::Parse ou alguma coisa parecida, e funcionou muito bem.

   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




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