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