[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