[Rio-pm] Comparação de arquivos

Aureliano Guedes guedes_1000 em hotmail.com
Sábado Novembro 24 10:52:00 PST 2012


Breno, que ser meu orientador... hahaha...

Enfim, ficou assim http://pastebin.com/zrpLGwQs

Ha algo que você mudaria??? 

> Date: Sat, 24 Nov 2012 09:45:41 -0200
> From: breno em rio.pm.org
> To: rio-pm em pm.org
> Subject: 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/20121124/bff07eb6/attachment.html>


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