<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><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="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">e o que acontece então aqui:<br></div><div>"valores agrupados na regex por nome dentro do hash %+. No caso,<br>acessei o grupo (?<mirna>....) fazendo $+{mirna};"</div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;"><br></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">Criaste um hash de nome %+ ????
 <br></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">É uma variável reservada?</div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">Qual o valor que assume $mirna aqui?</div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do hash %dados assim?</div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;"><br></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;
font-style:normal;">[]'s</div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;">Nicole Scherer<br></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;"><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" size="2"> <hr size="1">  <b><span style="font-weight:bold;">De:</span></b> breno <breno@rio.pm.org><br> <b><span style="font-weight: bold;">Para:</span></b> Perl Mongers Rio de Janeiro <rio-pm@pm.org> <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> <br>2012/11/24 Aureliano Guedes <<a ymailto="mailto:guedes_1000@hotmail.com" href="mailto:guedes_1000@hotmail.com">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 ymailto="mailto:Rio-pm@pm.org" 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><br><br> </div> </div>  </div></body></html>