a partir de alguma versão recente (5.12 ?) introduziu os named groups. Vc acessa atraves do hash %+ que é uma variavel especial "amarrada" a ultima expressão regular daquele bloco de codigo.<div><br></div><div>criar variaveis é perigoso. se vc tem algo como</div>
<div><br></div><div>$password</div><div><br></div><div>não vai querer isso sobreescrito por</div><div><br></div><div>/(?<password>.+)/</div><div><br></div><div>por isso vc acessa $+{password} o quanto antes, pois a proxima operação de match vai resetar a variavel<br>
<br><div class="gmail_quote">2012/11/26 Nicole <span dir="ltr"><<a href="mailto:bionica2007-perl@yahoo.com" target="_blank">bionica2007-perl@yahoo.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:times new roman,new york,times,serif"><div>Oi a todos,<br><br>aproveitando a paciência infinita do Breno...<br><br></div><div>Poderias esclarecer como funciona isto:<br> (?<tag>...) </div>
<div><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">e o que acontece então aqui:<br></div><div class="im"><div>"valores agrupados na regex por nome dentro do hash %+. No caso,<br>
acessei o grupo (?<mirna>....) fazendo $+{mirna};"</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
Criaste um hash de nome %+ ????
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">É uma variável reservada?</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
Qual o valor que assume $mirna aqui?</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do hash %dados assim?</div>
<div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
[]'s</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Nicole Scherer<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div><br></div> <div style="font-family:times new roman,new york,times,serif;font-size:12pt"> <div style="font-family:times new roman,new york,times,serif;font-size:12pt"> <div dir="ltr"> <font face="Arial"> <hr size="1">
<b><span style="font-weight:bold">De:</span></b> breno <<a href="mailto:breno@rio.pm.org" target="_blank">breno@rio.pm.org</a>><br> <b><span style="font-weight:bold">Para:</span></b> Perl Mongers Rio de Janeiro <<a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a>> <br>
<b><span style="font-weight:bold">Enviadas:</span></b> Sábado, 24 de Novembro de 2012 9:45<br> <b><span style="font-weight:bold">Assunto:</span></b> Re: [Rio-pm]
Comparação de arquivos<br> </font> </div><div><div class="h5"> <br>2012/11/24 Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>>:<br>><br>> Se não for ser muito chato, como faço para seguir a forma abaixo:<br>
><br>><br>>> 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem<br>>> modificar $/) e ir acumulando as linhas até encontrar um símbolo que<br>>> indique nova entrada.<br>><br>> seria algo do tipo:<br>
><br>> while (<$fh>){<br>> if(/primeira linha/){<br>> print $_;<br>> }<br>> elsif (/ultima linha/){<br>> #sair do loop<br>> }<br>> else {<br>> print $_<br>> }<br>> }<br>><br><br>
Algo como (atenção, código não testado):<br><br>---------------8<---------------<br>my %dados = ();<br>my $mirna;<br>my $acumulador;<br><br>while (my $linha = <$fh>) {<br> if ( $linha =~ m{tag
magica (?<mirna>\S+)} ) {<br> $dados{$mirna} = $acumulador if $mirna;<br> $mirna = $+{mirna};<br> $acumulador = q();<br> }<br> else {<br> $acumulador .= $linha;<br> }<br>}<br><br>use DDP; p %dados;<br>
<br>--------------->8---------------<br><br>O que isso faz (ou deveria fazer: já mencionei que não testei?<br>Programar a essa hora da manhã não é meu forte, então favor<br>desconsiderar qualquer besteira):<br><br>1) le o arquivo linha por linha, atribuindo o valor de cada linha a<br>
$linha (sem usar $_)<br>2) sempre que encontrar a tag mágica que separa entradas (estou<br>assumindo que a tag indica um novo registro que pode ser chave do seu<br>hash de dados:<br>2.1) se já estiver com um registro em memória ($mirna), bota os dados<br>
acumulados ($acumulador) dentro do hash;<br>2.2) atribui à $mirna o novo registro encontrado. Note que
estou<br>usando grupos nomeados na regex, fazendo (?<tag>...) em vez de apenas<br>(...). Isso funciona a partir do 5.10.0 e me permite acessar os<br>valores agrupados na regex por nome dentro do hash %+. No caso,<br>
acessei o grupo (?<mirna>....) fazendo $+{mirna};<br>2.2) zera o acumulador.<br>3) se não encontrar a tag mágica, vai acumulando os dados. Dentro<br>desse 'else' vc pode fazer coisas como "next if $linha =~ /.../" caso<br>
não queira guardar alguma linha, por exemplo.<br>4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.<br><br><br>Entendeu?<br><br>[]s<br><br>-b<br>_______________________________________________<br>Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br><a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br><br><br> </div></div></div> </div>
</div></div><br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br>
<br><a href="http://pacman.blog.br">http://pacman.blog.br</a><br>
</div>