[Rio-pm] Comparação de arquivos

Nicole bionica2007-perl em yahoo.com
Segunda Novembro 26 04:44:20 PST 2012


Oi a todos,

aproveitando a paciência infinita do Breno...


Poderias esclarecer como funciona isto:
(?<tag>...) 

e o que acontece então aqui:

"valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?<mirna>....) fazendo $+{mirna};"

Criaste um hash de nome %+ ???? 

É uma variável reservada?
Qual o valor que assume $mirna aqui?
Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do hash %dados assim?

[]'s
Nicole Scherer




________________________________
 De: breno <breno em rio.pm.org>
Para: Perl Mongers Rio de Janeiro <rio-pm em pm.org> 
Enviadas: Sábado, 24 de Novembro de 2012 9:45
Assunto: Re: [Rio-pm] Comparação de arquivos
 
2012/11/24 Aureliano Guedes <guedes_1000 em hotmail.com>:
>
> Se não for ser muito chato, como faço para seguir a forma abaixo:
>
>
>> 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
>> modificar $/) e ir acumulando as linhas até encontrar um símbolo que
>> indique nova entrada.
>
> seria algo do tipo:
>
> while (<$fh>){
> if(/primeira linha/){
> print $_;
> }
> elsif (/ultima linha/){
> #sair do loop
> }
> else {
> print $_
> }
> }
>

Algo como (atenção, código não testado):

---------------8<---------------
my %dados = ();
my $mirna;
my $acumulador;

while (my $linha = <$fh>) {
   if ( $linha =~ m{tag magica (?<mirna>\S+)} ) {
      $dados{$mirna} = $acumulador if $mirna;
      $mirna = $+{mirna};
      $acumulador = q();
   }
   else {
      $acumulador .= $linha;
   }
}

use DDP; p %dados;

--------------->8---------------

O que isso faz (ou deveria fazer: já mencionei que não testei?
Programar a essa hora da manhã não é meu forte, então favor
desconsiderar qualquer besteira):

1) le o arquivo linha por linha, atribuindo o valor de cada linha a
$linha (sem usar $_)
2) sempre que encontrar a tag mágica que separa entradas (estou
assumindo que a tag indica um novo registro que pode ser chave do seu
hash de dados:
2.1) se já estiver com um registro em memória ($mirna), bota os dados
acumulados ($acumulador) dentro do hash;
2.2) atribui à $mirna o novo registro encontrado. Note que estou
usando grupos nomeados na regex, fazendo (?<tag>...) em vez de apenas
(...). Isso funciona a partir do 5.10.0 e me permite acessar os
valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?<mirna>....) fazendo $+{mirna};
2.2) zera o acumulador.
3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
desse 'else' vc pode fazer coisas como "next if $linha =~ /.../" caso
não queira guardar alguma linha, por exemplo.
4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.


Entendeu?

[]s

-b
_______________________________________________
Rio-pm mailing list
Rio-pm em pm.org
http://mail.pm.org/mailman/listinfo/rio-pm
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121126/88e40413/attachment.html>


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