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