[Cascavel-pm] Separando campos

Luis Motta Campos luismottacampos em yahoo.co.uk
Segunda Março 19 08:57:57 PDT 2007


On Mar 19, 2007, at 4:03 PM, Gabriel Vieira wrote:
> Correção: no 2o o nome da rua aparece apenas "29 Junho".
> On 3/19/07, Gabriel Vieira <gabriel.vieira em gmail.com> wrote:
> $endereco = "R MARGARIDAS 13 QD8 C 13";
> $endereco = "AV 29 JUNHO 00602";
> print "Tipo: $1\nRua: $2\nNúmero: $4\nComplemento: $6" if $endereco  
> =~ /^(\w+)\s+((\s|\w)+?)\s+(\d+)(\s+((\s|\w)+))?$/;
>
> # Tipo: R
> # Rua: MARGARIDAS
> # Número: 13
> # Complemento: QD8 C 13
>
> # e
>
> # Tipo: AV
> # Rua: AV 29 JUNHO
> # Número: 00602
> # Complemento:

   Minhanossasenhoraaparecida!
   Assim, a gente perpetua ainda mais a fama ruim da linguagem...
   Espera. Faz assim:

   #!/usr/bin/perl
   use strict;
   use warnings;
   my $expressao_regular =
   qr{^          # um início de linha
      (\w+)      # seguido de uma palavra: o TIPO DE LOGRADOURO
      \s+        # seguido de um ou mais espaços
      (
        (\s|\w)+ # seguido de uma ou mais palavras ou espaços: o NOME  
DO LOGRADOURO
      ?)         # mas não seja guloso: consuma o mínimo que conseguir.
      \s+        # seguido de um ou mais espaços
      (\d+)      # seguido de um ou mais dígitos: o NÚMERO
      (
        \s+      # seguido de um ou mais espaços
        (
          (\s|\w)+ # seguido de palavras ou espaços: o COMPLEMENTO
        )
      )?        # opcionalmente.
      $
     }x;

   # Agora, continuamos com a nossa "programação normal":
   print "Tipo: $1\nRua: $2\nNúmero: $4\nComplemento: $6"
     if $expressao_regular =~ $endereco;

   __END__

   Agora, sim, isso parece racionalmente possível de ler e manter!
   Muito cuidado, galera!
   Os iniciantes não sabem fazer isso, é melhor prevenir que remediar.

   Verônica, se você tiver problemas, pergunta, que a gente sempre  
responde. Sempre. ;-)
   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