[Rio-pm] Comparação de arquivos

Aureliano Guedes guedes_1000 em hotmail.com
Sexta Novembro 23 14:22:53 PST 2012


Breno, valeu mesmo por mais dicas preciosas, dessa ultima forma que me falou foi bem mais facil codar. A logica foi super-simples mas não fui capaz de pensar nisso sozinho.

Mais ainda estou com um problema e uma duvida.

- devido o $/ o print não esta saindo completo, vem faltando parte do documento, justamente o valor de $/. Como resolver isso?

- Não entendo o que você quer dizer com "testar o valor de retorno de funções como open()"?

Em fim segue o codigo: http://pastebin.com/KH2bAGWU

Desconcidere o seu modulo Data::Printer, usei ele para testar o hash e esqueci de tirar do codigo depois, XD. (Otimo modulo).

> Date: Fri, 23 Nov 2012 01:30:35 -0200
> From: breno em rio.pm.org
> To: rio-pm em pm.org
> Subject: Re: [Rio-pm] Comparação de arquivos
> 
> 2012/11/22 Aureliano Guedes <guedes_1000 em hotmail.com>:
> > Opa, obrigado pela ajuda e pelas preciosas dicas.
> >
> > - Não achei uma função no List::MoreUtils que fizesse o mesmo que o dups do
> > Array::Uniq, tem alguma função no List::MoreUtils que crie um terceiro array
> > apenas com itens que outros dois ou mais arrays tem em igual?
> >
> 
> Tem razão, Aureliano. A função dup() do List::MoreUtils remove
> duplicatas, não as retorna para você. Se o Array::Uniq te atende
> então, maravilha. Se preferir resolver direto no Perl, seguem algumas
> alternativas (só por desencargo mesmo):
> 
> ------------
> my %duplicadas = ();
> my %visitadas  = ();
> foreach (@a, @b) {
>   $visitadas{$_}++ && $duplicadas{$_}++;
> }
> my @resultado = sort keys %duplicadas;
> ------------
> my @resultado = ();
> foreach my $item (sort @b) {
>   push @resultado, $item if any { $item eq $_ } @a;
> }
> ------------
> my %visitadas = ();
> my @resultado = sort grep { $visitadas{$_}++ == 1 } @a, @b;
> ------------
> 
> > - Particularmente não vi vantagem em usar o Path::Class, para meu caso qual
> > seria a vantagem?
> >
> 
> O Path::Class resolve um monte de coisas pra vc. Hoje você abre
> arquivos no mesmo diretório. Se amanhã quiser usar diretórios
> diferentes, cada sistema tem um separador diferente ('/', '\', etc). O
> Path::Class faz isso pra vc. Outro motivo é a preguiça. Escrever:
> 
> my $fh = file( $nome_do_arquivo )->openr;
> 
> é a mesma coisa que escrever:
> 
> open my $fh, '<', $nome_do_arquivo
>   or Carp::croak "error opening file $nome_do_arquivo: $!\n";
> 
> Se vc só vai fazer isso, tudo bem. Mas quando começa a ter que passear
> e manipular arquivos e diretórios, acredite: faz toda a diferença :)
> 
> Independente do que escolher, lembre-se sempre de testar o valor de
> retorno de funções como open(), bem como usar open() sempre com 3
> argumentos!
> 
> > - Quanto a criar um modulo fazendo o que as subs fazem, depois vou pensar
> > nessa hipotese, mais um modulo para o BioPerl não faz mal.
> >
> 
> Maravilha!
> 
> > - Quanto ao que você falou no item 11:
> >
> > - Continuei usando barewords pois não deu certo usando strings, por algum
> > motivo que não sei por que? (Afinal qual o problema das barewords?)
> >
> 
> Não diga "não deu certo", nos diga o erro!
> 
> Barewords são problemáticas por diversos motivos, o principal deles é
> que são globais. Lembra dos bugs de "ação à distância"? Pois é, se vc
> usar sem querer o mesmo nome de file handle (digamos, "FH", "FILE",
> "ARQ" ou equivalente) em diferentes lugares, seu programa vai se
> comportar de maneira estranha e vc não vai ter idéia do motivo. Por
> mais que você ache que seu programa é pequeno e controlável agora, é o
> tipo de boa prática que compensa *muito* a medida que o programa
> escala (ou o tempo passa e vc tem q manter o código 6 meses depois).
> 
> Variáveis podem ser utilizadas como filehandle desde o Perl 5.6.0, de
> 12 anos atrás. Desde então, esse tem sido o meio recomendado para
> lidar com arquivos - a menos que vc esteja fazendo um oneliner rápido
> na linha de comando, ou lidando com handles nativos como STDIN,
> STDOUT, DATA, etc.
> 
> >
> > "11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt'
> > duas vezes para leitura. Isso normalmente significa que você poderia
> > ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido
> > o arquivo apenas uma vez (operações de E/S costumam ser bem mais
> > pesadas do que manipulação em memória). Dica: sempre que tiver mais de
> > um while() ou foreach() varrendo a mesma estrutura para ler dados, é
> > bem possível que você possa otimizar e deixar mais claro seu algoritmo
> > fazendo a varredura apenas uma vez."
> >
> > Isso me preocupou, veja bem, não consegui pensar em uma forma de varrer o
> > arquivo fazendo o que preciso apenas em um laço.
> > parsin_h e parsin_m extraem um valor que são gravados em array, @inh e @inm
> > respectivamente, depois um terceiro array (@in) é criado apenas com os
> > valores que @inh e @inm tem em comum.
> > Os valores de @in são a referencia de "o que" eu quero extrair dos arquivos
> > hybrid.txt e miranda.txt.
> >
> 
> Você pode por exemplo passar uma vez só em cada arquivo e armazenar os
> elementos como pares chave-valor, por exemplo:
> 
> my %miranda = (
>    'hsa-miR-15a' => '...',
>    'hsa-miR-16' => '...',
>    ...
> );
> 
> my %hybrid = (
>    'hsa-miR-16-1*' => '...',
>    'hsa-miR-17' => '...',
>    ...
> );
> 
> depois, para cada item em %miranda, se a chave também existir em
> %hybrid, vc preenche o seu arquivo de saída com os valores que quiser,
> do jeito que quiser. Com isso vc de quebra dispensa o Array::Uniq e
> otimiza a sua lógica:
> 
> foreach my $mirna (keys $miranda) {
>    if (exists $hybrid{$mirna}) {
>       say "o mirna $mirna existe em ambos os arquivos!";
>       say "miranda: $miranda{$mirna}";
>       say "hybrid: $hybrid{$mirna}";
>    }
> }
> 
> 
> []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/20121123/a1131412/attachment.html>


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