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

breno breno em rio.pm.org
Quinta Março 20 16:07:12 PDT 2008


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
>


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