[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