<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
<font style="font-size: 12pt;" face="Arial" size="3">Opa, obrigado pela ajuda e pelas preciosas dicas.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">- 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?</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">- Particularmente não vi vantagem em usar o Path::Class, para meu caso qual seria a vantagem?</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">- 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.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">- Quanto ao que você falou no item 11:</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">- 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?)</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">"11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt'</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">duas vezes para leitura. Isso normalmente significa que você poderia</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">o arquivo apenas uma vez (operações de E/S costumam ser bem mais</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">pesadas do que manipulação em memória). Dica: sempre que tiver mais de</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">um while() ou foreach() varrendo a mesma estrutura para ler dados, é</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">bem possível que você possa otimizar e deixar mais claro seu algoritmo</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">fazendo a varredura apenas uma vez."</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">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.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">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.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Os valores de @in são a referencia de "o que" eu quero extrair dos arquivos hybrid.txt e miranda.txt.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Realmente o excesso de operações I/O pesam mas infelizmente não estou conseguindo fugir disso, e desempenho na bioinformatica é importante.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Pesso ajuda para solucionar esse mistério tambem.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Outro problema é que o output esta feio e ainda o $/ esta sendo omitido.</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">link do script com as devidas alterações -> http://pastebin.com/DNuiLUHG</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">link do miranda.txt ->http://pastebin.com/qiYavtUe </font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">link do hybrid.txt -> http://pastebin.com/9v6WFUT7</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Agora para exclarecer os arquivos:</font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3"><br></font><font style="font-size: 12pt;" face="Arial" size="3">Miranda pode ter dois formatos:</font><br><br><font style="font-size: 8pt;" size="1">Read Sequence:hsa-miR-4448 MIMAT0018967 Homo sapiens miR-4448(20 nt)</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Read Sequence:01010101 (582 nt)</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Performing Scan: <b>hsa-miR-4448</b> vs 01010101</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Score for this Scan:</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">No Hits Found above Threshold</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Complete</font><br><br><font style="font-size: 12pt;" face="Arial" size="3">ou</font><br><br><font style="font-size: 8pt;" size="1">Read Sequence:hsa-miR-4701-3p MIMAT0019799 Homo sapiens miR-4701-3p(20 nt)</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Read Sequence:01010101 (582 nt)</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Performing Scan: <b>hsa-miR-4701-3p</b> vs 01010101</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">   Forward:    Score: 140.000000  Q:2 to 9  R:205 to 224 Align Len (7) (100.00%) (100.00%)</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">   Query:    3' ugugguguggguAGUGGGUa 5'</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">                            ||||||| </font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">   Ref:      5' ccatgggggagcTCACCCAc 3'</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">   Energy:  -12.410000 kCal/Mol</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Scores for this hit:</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">>hsa-miR-4701-3p    01010101    140.00    -12.41    2 9    205 224    7    100.00%    100.00%</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Score for this Scan:</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Seq1,Seq2,Tot Score,Tot Energy,Max Score,Max Energy,Strand,Len1,Len2,Positions</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">>>hsa-miR-4701-3p    01010101    140.00    -12.41    140.00    -12.41    1524    20    582     205</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">Complete</font><br><br><font style="font-size: 12pt;" face="Arial" size="3">A diferença é que em um não houve analise e em outro houve, o valor que esta em negrito é o que eu estou procurando.</font><br><br><font style="font-size: 12pt;" face="Arial" size="3">Hybrid so tem o seguinte formato:</font><br><br><font style="font-size: 8pt;" size="1">target: 01010101</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">length: 581</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">miRNA : <b>hsa-miR-15a</b></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">length: 22</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">mfe: -24.4 kcal/mol</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">p-value: 0.334111</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">position  244</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">target 5' C    UCUCCUGUGGUCUCU     G           U 3'</font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">           CACA               GACCA    GUGCUGUU    </font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">           GUGU               UUGGU    CACGACGA    </font><font style="font-size: 8pt;" size="1"><br></font><font style="font-size: 8pt;" size="1">miRNA  3'                          AAUA        U 5'</font><br><br><font style="font-size: 12pt;" face="Arial" size="3">E o valor que me importa é o que esta em negrito.</font><br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: bruno.buss@gmail.com<br>Date: Wed, 21 Nov 2012 14:21:18 -0200<br>To: rio-pm@pm.org<br>Subject: Re: [Rio-pm] Comparação de arquivos<br><br>breno++<br><br><div class="ecxgmail_quote">2012/11/21 breno <span dir="ltr"><<a href="mailto:breno@rio.pm.org">breno@rio.pm.org</a>></span><br><blockquote class="ecxgmail_quote" style="border-left:1px #ccc solid;padding-left:1ex">

Oi Aureliano,<br>
<br>
acho que o que o Tiago quis dizer é "o que deveria estar acontecendo<br>
mas não está, e o que está acontecendo em vez disso?"<br>
<br>
Assumindo que não há problema na lógica e o que está tentando resolver<br>
são os warnings que colou no final do paste, a resposta está na<br>
recomendação número 5 abaixo.<br>
<br>
Agora, algumas dicas gerais sobre o código que você colou:<br>
<br>
1) a solução canônica para manipulação de listas são os módulos<br>
List::Util, List::MoreUtils e List::AllUtils (que agrega as funções de<br>
ambos). No List::MoreUtils (e, consequentemente, no List::AllUtils) há<br>
a função uniq() que faz o mesmo que o Array::Uniq. Então, a menos que<br>
você tenha um excelente motivo para usar o Array::Uniq, recomendo<br>
trocar para o List::MoreUtils.<br>
<br>
<br>
2) Evite open() com apenas dois argumentos. Evite open() com barewords<br>
em vez de variáveis. Por mais que você saiba o que está fazendo,<br>
procure sempre manter a sintaxe:<br>
<br>
open my $fh, '<', $nome_do_arquivo<br>
   or die "erro abrindo arquivo $nome_do_arquivo para leitura: $!";<br>
<br>
para leitura, ou:<br>
<br>
open my $fh, '>' $nome_do_arquivo<br>
  or die "erro abrindo arquivo $nome_do_arquivo para escrita: $!";<br>
<br>
Se quiser omitir o "or die..." basta colocar "use autodie;" no início<br>
do seu programa.<br>
<br>
Mais ainda, pode usar módulos como Path::Class que já manipulam o<br>
arquivo para você:<br>
<br>
  use Path::Class;<br>
<br>
  my $fh = file( 'meuarquivo.txt' )->openr();  # ou openw() para escrever<br>
<br>
Veja mais detalhes em <a href="https://metacpan.org/module/Path::Class::File" target="_blank">https://metacpan.org/module/Path::Class::File</a><br>
<br>
<br>
3) Ao colar um exemplo, certifique-se que ele está limpo. A linha 75,<br>
por exemplo, tenta abrir um arquivo para escrita:<br>
<br>
open SL, ">:raw", "sl.txt" or die $!;<br>
<br>
mas não faz nada com ele.<br>
<br>
<br>
4) Evite usar termos como new() e $self quando seu código não for<br>
orientado a objetos. Essas não são palavras reservadas em Perl, mas<br>
convenciona-se que new() constrói objetos e $self os referencia. Usar<br>
esses nomes com outros objetivos confunde :)<br>
<br>
<br>
5) Evite "ações à distância"<br>
(<a href="https://en.wikipedia.org/wiki/Action_at_a_distance_%28computer_programming%29" target="_blank">https://en.wikipedia.org/wiki/Action_at_a_distance_%28computer_programming%29</a>).<br>
A variável especial $_, por exemplo, é global quando seu código espera<br>
que ela seja local. Repare que você está consumindo seus dados usando<br>
$_ implicitamente em 3 momentos distintos e concorrentes:<br>
<br>
  foreach (@in) {    # $_ definido como o valor atual em @in<br>
<br>
     print find_m($_), find_h($_);<br>
  }<br>
<br>
  sub find_m {<br>
     my $self = shift;<br>
     while (<INM2>) {  # $_ redefinido, agora para a linha atual<br>
        ...<br>
     }<br>
     # ao final do bloco, $_ estará como undef (pois o arquivo acabou)<br>
  }<br>
<br>
idem para a sub find_h.<br>
<br>
A solução? Bom, a partir do Perl 5.10 (lançado a quase 5 anos atrás) é<br>
possível usar uma versão léxica do $_ ao declará-lo no bloco com 'my'.<br>
É possível também restaurar o valor global de $_ no escopo atual<br>
usando 'our $_', mas não é isso o que você quer. Para deixar seu<br>
código claro e evitar efeitos colaterais, sugiro sempre "dar nomes aos<br>
bois" e nomear suas variáveis de loop. Por exemplo, trocar:<br>
<br>
   foreach (@in)<br>
<br>
por<br>
<br>
  foreach my $elemento (@in)<br>
<br>
já teria resolvido seu problema (assumindo, claro, que agora você<br>
estaria passando "$elemento" para as funções, em vez de "$_").<br>
Recomendo mudar também no while() dentro das subs.<br>
<br>
Outro problema de 'action at a distance' no seu código, menos grave<br>
mas ainda assim importante, é que você está usando nas funções find_m<br>
e find_h handles abertos em outro bloco, referenciados pela mesma<br>
bareword. Fiquei sem entender se a sua lógica considera o consumo<br>
linear do arquivo (para cada ocorrencia em @in, os arquivos hybrid.txt<br>
e miranda.txt estarão mais próximos do final) ou se isso é um bug.<br>
<br>
<br>
6) Não utilize 'our' quando não precisar - e você não precisa nesse<br>
exemplo. Para saber mais sobre origem e diferenças entre my, our,<br>
local e etc, recomendo a palestra do Util =><br>
<a href="http://youtu.be/Ton-5tvDQiE" target="_blank">http://youtu.be/Ton-5tvDQiE</a><br>
<br>
<br>
7) Não utilize variáveis globais quando não precisar - e você não<br>
precisa nesse exemplo.<br>
<br>
<br>
8) Não agrupe elementos em expressões regulares se não for utilizar.<br>
Nas regexes das subs parsin_m() e find_m() você tem dois grupos<br>
(parenteses () dentro da regex) e só usa o $1.<br>
<br>
<br>
9) Não manipule $/ diretamente. Se realmente precisar, faça "local $/<br>
= ..." dentro do bloco.<br>
<br>
<br>
10) Se as saídas de 'hybrid' e 'miranda' são sempre nesse formato,<br>
crie um parser separadamente para elas e utilize em seu código. Deixa<br>
tudo mais limpo e de quebra você ainda pode colocar no CPAN e ajudar<br>
outras pessoas :)<br>
<br>
<br>
11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt'<br>
duas vezes para leitura. Isso normalmente significa que você poderia<br>
ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido<br>
o arquivo apenas uma vez (operações de E/S costumam ser bem mais<br>
pesadas do que manipulação em memória). Dica: sempre que tiver mais de<br>
um while() ou foreach() varrendo a mesma estrutura para ler dados, é<br>
bem possível que você possa otimizar e deixar mais claro seu algoritmo<br>
fazendo a varredura apenas uma vez.<br>
<br>
<br>
12) Sempre que o seu programa estiver fazendo algo estranho, tente<br>
diminuir ao máximo a superfície de erro, e inspecionar o valor das<br>
variáveis. No seu caso, por exemplo, o interpretador disse que o<br>
problema estava quando a sua linha de print chamava as funções:<br>
<br>
   print OUT ("#" x 20 , find_m($_) , "\n" , find_h($_) , "#" x 20 , "\n");<br>
<br>
então o primeiro passo seria desmembrar, retirando tudo que é inútil (<br>
'#' x 20 ) e colocando cada chamada em uma linha diferente, para<br>
tentar isolar o erro. Outra, claro, é imprimir direto na tela em vez<br>
de em arquivo:<br>
<br>
   print find_m($_);<br>
   print "\n";<br>
   print find_h($_);<br>
<br>
Se a sua variável for uma estrutura maior em vez de apenas uma string,<br>
soluções como o Data::Printer podem te ajudar também.<br>
<br>
<br>
Espero ter ajudado!<br>
<br>
[]s<br>
<span class="ecxHOEnZb"><font color="#888888"><br>
-b<br>
</font></span><div class="ecxHOEnZb"><div class="h5">_______________________________________________<br>
Rio-pm mailing list<br>
<a 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>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Bruno C. Buss<br><a href="http://www.brunobuss.net" target="_blank">http://www.brunobuss.net</a><br>
<br>_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm</div>                                    </div></body>
</html>