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

Lucas Mateus lucasmateus.oliveira em gmail.com
Segunda Março 24 20:17:41 PDT 2008


Acho que esse ficou melhor.


use strict;
use warnings;
use Data::Dumper;

my (@list, $string);

$_ = $string = <<EOT;
key: value1
+cap3
+cap4
+cap5
key:value2
EOT

@list = (m/(\w+)/xmg, undef);

print Dumper \@list;

__END__






Em 24/03/08, Lucas Mateus <lucasmateus.oliveira em gmail.com> escreveu:
>
> Corrigindo a RegExp
>
> s/(\w+)(?{push(@list, $1)})//g && push(@list, undef);
>
>
>
>
> Em 24/03/08, Lucas Mateus <lucasmateus.oliveira em gmail.com> escreveu:
> >
> > Bom não sei se entendi certo, mas cheguei no resultado
> >
> >
> > use strict;
> > use warnings;
> > use Data::Dumper;
> >
> > my (@list, $string);
> >
> > $_ = $string = <<EOT;
> > key: value1
> > +cap3
> > +cap4
> > +cap5
> > key:value2
> > EOT
> >
> > s/(\w+)(?{$1 && push(@list, $1)})//g && push(@list, undef);
> >
> > print Dumper \@list;
> >
> > __END__
> >
> >
> >
> >
> > Em 24/03/08, Marcel <webknowledge em gmail.com> escreveu:
> > >
> > > perl -MData::Dumper -e
> > > '$string="chave1:valor1\nbla\nble\nbli\nchave2:valor2\nblo\nblu\nchave3:
> > > valor3\nbly\n"; @list = $string =~
> > > m{(?:^([\S+]+):\s*((?:(?:[^\n]+|[\t]*))))|(?:^([\S+]+))}xmg; print Dumper
> > > \@list';
> > > $VAR1 = [
> > >           'chave1',
> > >           'valor1',
> > >           undef,
> > >           undef,
> > >           undef,
> > >           'bla',
> > >           undef,
> > >           undef,
> > >           'ble',
> > >           undef,
> > >           undef,
> > >           'bli',
> > >           'chave2',
> > >           'valor2',
> > >           undef,
> > >           undef,
> > >           undef,
> > >           'blo',
> > >           undef,
> > >           undef,
> > >           'blu',
> > >           'chave3',
> > >           'valor3',
> > >           undef,
> > >           undef,
> > >           undef,
> > >           'bly'
> > >         ];
> > >
> > > Ou seja, pra cada linha a expressão espera 3 valores para comparar.
> > > Caso não encontre alguma, devolve undef.
> > >
> > > 2008/3/24 Marcel <webknowledge em gmail.com>:
> > >
> > > > 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
> > > > >
> > > >
> > > >
> > >
> > > _______________________________________________
> > > 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/20080325/1b5ec0bb/attachment.html 


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