[SP-pm] Capturando Uma Quantidade Arbitrária de Valores Com Uma Expressão Regular - Sugestões?

Marcel webknowledge em gmail.com
Segunda Março 24 18:04:32 PDT 2008


Eu tb tentei de todo jeito descobrir uma única regexp para realizar a
tarefa. Mas só consegui retornar o que o breno conseguiu retornar. Um undef
pra cada non-matched.

2008/3/20 breno <breno em rio.pm.org>:

> Oi Champs,
>
> Desculpe se estou falando besteira, mas o seu $key_value (qr{ $key
> $value $continuation }x ) está procurando diretamente por chave:valor
> E pela continuação (o +cap...) na mesma linha (o modificador "m" vc só
> passa no match do $key_value, e não antes). Não olhei com calma mas só
> de mudar para ( qr{ $key $value | $continuation }x ) obtive
>
> $VAR1 = [
>          'key',
>          'value1',
>          undef,
>          undef,
>          undef,
>          'cap3',
>          undef,
>          undef,
>          'cap4',
>          undef,
>          undef,
>          'cap5',
>          undef,
>          undef,
>          undef,
>          'key',
>          'value2',
>          undef,
>          undef,
>          undef,
>          undef,
>          undef,
>          undef,
>          undef
>        ];
>
> que fora os undef's, é o que vc quer. Mas olhando a estrutura não acho
> que seja o que vc quer (embora não tenha entendido ainda o propósito
> :-), e sim um "my $continuation  = qr{ (?: \n \+ $value )* }mx;" (e
> não "?}x" ) - mantendo o $key $value $continuation sem "or". O
> problema é que isso devolve
>
> $VAR1 = [
>          'key',
>          'value1',
>          'cap5',
>          'key',
>          'value2',
>          undef
>        ];
>
> Que é só uma variação inútil do que vc já tinha. Enfim, são só
> ramblings feitos em 5 minutos, e sou péssimo em expressões regulares.
> Mas com sorte te dei algumas idéias para atacar o problema ou sei lá.
>
> []s
>
> -b
>
>
> 2008/3/20 Luis Motta Campos <luismottacampos em yahoo.co.uk>:
> >   Gente,
> >
> >   Eu estou tentando capturar uma quantidade arbitrária de valores usando
> >  uma expressão regular, mas estou com problemas. O meu código é este
> aqui:
> >
> >  #!/usr/bin/perl
> >  use strict;
> >  use warnings;
> >
> >  my $string = <<EOT;
> >  key: value1
> >  +cap3
> >  +cap4
> >  +cap5
> >  key:value2
> >  EOT
> >
> >  my $key_value = do {
> >     my $key           = qr{ ^ ( [a-zA-Z]+ ) : }x;
> >     my $empty_value   = qr{ [ \t]* }x;
> >     my $free_form_str = qr{ [^\n]+ }x;
> >     my $value = qr{ \s* ( (?: $free_form_str | $empty_value ) ) }x;
> >     my $continuation  = qr{ (?: \n \+ $value )? }x;
> >     qr{ $key $value $continuation }x;
> >  };
> >
> >  print $key_value, $/;
> >
> >  use Data::Dumper;
> >  my @list = $string =~ m{ $key_value }xmg;
> >  print Dumper \@list;
> >  __END__
> >
> >  O resultado que eu tenho de rodar isso é
> >
> >  $VAR1 = [
> >           'key',
> >           'value1',
> >           'cap3',
> >           'key',
> >           'value2',
> >           undef
> >         ];
> >
> >  Mas o resultado que eu quero é
> >
> >  $VAR1 = [
> >           'key',
> >           'value1',
> >           'cap3',
> >           'cap4',
> >           'cap5',
> >           'key',
> >           'value2',
> >           undef
> >         ];
> >
> >  Podem haver uma quantidade arbitrária, não-determinada, não-previamente
> >  declarada de valores "+cap#" (onde "#" é um inteiro positivo).
> >
> >  Vocês por acaso não tem uma sugestão de como eu poderia implementar
> isso?
> >
> >  Meu Perl é o 5.8.8, apenas para constar.
> >
> >  Obrigado a todo mundo com antecedência.
> >  Putamplexos!
> >  --
> >  Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
> >  Perl fanatic evangelist, and amateur {cook, photographer}
> >
> >  _______________________________________________
> >  SaoPaulo-pm mailing list
> >  SaoPaulo-pm em pm.org
> >  http://mail.pm.org/mailman/listinfo/saopaulo-pm
> >
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080324/b5385007/attachment.html 


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