<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'>
Gabriel++, o Andre parece que é da bioinformatica, na bioinformatica ja deparei com problema parecido, e a minha solução superou a marca de 8 linhas, ao passo que apenas com '<br><pre>push @array, $key unless exists $hash{$key};' você resolveu. Obrigado, acabastes de me ajudar sem eu pedir.</pre><br><div><div id="SkyDrivePlaceholder"></div>> From: gabriel.vieira@gmail.com<br>> Date: Mon, 4 Jun 2012 01:57:05 -0300<br>> To: rio-pm@pm.org<br>> Subject: Re: [Rio-pm] extraindo strings de um arquivo<br>> <br>> Sort mantém ordenada de acordo com os nomes da chave, não de acordo<br>> com o momento que as chaves foram criadas.<br>> <br>> Se for isso que você quer, então sim, use. :)<br>> <br>> Dê uma lida no perlfunc do sort para saber como lidar com sort de<br>> números e de palavras.<br>> <br>> 2012/6/4 André Torres <andretorresrj@gmail.com>:<br>> > Eu consegui achar uma resposta pra isso e acredito que a melhor forma seria<br>> > usar o sort para manter as chaves ordenadas.<br>> > esse foi o link que comenta sobre os valores serem retornados<br>> > aleatoriamente. http://perldoc.perl.org/functions/keys.html<br>> ><br>> > o que vcs acham?<br>> ><br>> > Abraço.<br>> ><br>> ><br>> > Em 4 de junho de 2012 00:32, André Torres <andretorresrj@gmail.com><br>> > escreveu:<br>> ><br>> >> Gabriel e Breno,<br>> >><br>> >> Obrigado pelas respostas super úteis.<br>> >> Entao, eu fiz as modificações que vcs me sugeriram. O fato de colocar a<br>> >> hash para ordenar os 2 valores em função do nome foi ótimo, pq ja vou saber<br>> >> que nomes tiveram mais de duas repetições para "triad" e "binding". Agora,<br>> >> tenho uma duvida como os valores sao lidos e guardados na hash, pois o meu<br>> >> output nao sai ordenado pelo nome como no arquivo input. eu fiz algo errado,<br>> >> ou existe uma forma de deixar a lista ordenada pelos nomes da mesma forma<br>> >> que o input?<br>> >> em relação ao resto do codigo, eu cosegui compreender as soluções, exceto<br>> >> por uma das soluções que o Gabriel deu em relação a ler a nova antiga e a<br>> >> linha atual.<br>> >> o código modificado vai no final do texto.<br>> >><br>> >> Muito obrigado.<br>> >><br>> >> André Torres.<br>> >><br>> >><br>> >> exemplo de input X output:<br>> >> input:<br>> >> name<br>> >> 32<br>> >> 45<br>> >> 65<br>> >> ...<br>> >><br>> >> output:<br>> >> name<br>> >> 65<br>> >> 32<br>> >> 45<br>> >> ...<br>> >><br>> >> ________________________________________________________________________<br>> >> #!/usr/bin/perl<br>> >> use strict;<br>> >> use warnings;<br>> >><br>> >> #my $hmm_name = $ARGV[0];<br>> >> my @name_seq;<br>> >> my $line;<br>> >> #my $linha_atual;<br>> >> #my $linha_anterior;<br>> >> my $triad;<br>> >> my $T;<br>> >> my $BP;<br>> >><br>> >> my $hmm_name = shift;<br>> >><br>> >> open my $fh, '<', $hmm_name or die "Error: $!";<br>> >> my %sequencias = ();<br>> >> while (<$fh>){<br>> >>    next unless /^Q#/;<br>> >>    my @name_seq = split /\s+/;<br>> >>        if ($name_seq[5] eq 'triad' or $name_seq[5] eq 'binding'){<br>> >>        $triad = $name_seq[-4];<br>> >>        }<br>> >>        else{<br>> >>        print "nao existe triade ou binding poket"; #caso $triad recupere<br>> >> algum valor diferente de 'triad' ou 'binding'<br>> >>        }<br>> >>        $sequencias{$name_seq[2]} .='|***'. $triad; #define $name_seq[2]<br>> >> como a chave<br>> >> }<br>> >>           foreach my $seq (keys %sequencias){ # o valor de cada chave<br>> >> organizada na hash é passada para a variavel $seq.<br>> >>           print $seq . $sequencias{ $seq } . "\n"; #imprime a chave e os<br>> >> campos relacionados a cada uma.<br>> >>           }<br>> >> close $fh;<br>> >> exit;<br>> >><br>> >> ___________________________________________________________________________________<br>> >><br>> >><br>> >><br>> >><br>> >><br>> >> Em 2 de junho de 2012 18:34, breno <breno@rio.pm.org> escreveu:<br>> >><br>> >>> Boa Gabriel!<br>> >>><br>> >>> André, usando as dicas dele, que tal a seguinte versão:<br>> >>><br>> >>> ------------------->8-------------------<br>> >>> my $hmm_name = shift;<br>> >>><br>> >>> open my $fh, '<', $hmm_name<br>> >>>  or die "Error: $!";<br>> >>><br>> >>> my %sequencias = ();<br>> >>><br>> >>> while (<$fh>) {<br>> >>>  next unless /^Q#/;<br>> >>><br>> >>>  my @name_seq = split /\s+/;<br>> >>><br>> >>>  my ($name_seq, $triad) = @name_seq[2,5];<br>> >>><br>> >>>  if ($triad eq 'triad' or $triad eq 'binding') {<br>> >>>    $sequencias{ $name_seq } .= '|' . $name_seq[-4];<br>> >>>  }<br>> >>> }<br>> >>><br>> >>> foreach my $seq (keys %sequencias) {<br>> >>>  print $seq . $sequencias{ $seq } . "\n";<br>> >>> }<br>> >>><br>> >>> close $fh;<br>> >>> -------------------8<-------------------<br>> >>><br>> >>> Você consegue entender o que cada parte está fazendo? Isso te atende?<br>> >>> Preste atenção nas dicas do Gabriel e não deixe de responder se tiver<br>> >>> alguma dúvida!<br>> >>><br>> >>><br>> >>> []s<br>> >>><br>> >>> -b<br>> >>><br>> >>> 2012/6/2 Gabriel Vieira <gabriel.vieira@gmail.com>:<br>> >>> > 1) Sempre inicie os seus programas com:<br>> >>> ><br>> >>> > use strict;<br>> >>> > use warnings;<br>> >>> ><br>> >>> ><br>> >>> > 2) Use o open com 3 parâmetros:<br>> >>> ><br>> >>> > open my $f, '<', $hmm_name or die "Error: $!";<br>> >>> ><br>> >>> ><br>> >>> > 3) Evite usar a variável especial $_, declare uma variável para<br>> >>> > receber o conteúdo:<br>> >>> ><br>> >>> > while ( my $line = <$f> ) {<br>> >>> ><br>> >>> > 4) Declare suas variáveis, sempre:<br>> >>> ><br>> >>> >      my @name_seq = split /\s+/, $line;<br>> >>> >      my $name_seq   = $name_seq[2];<br>> >>> >      my $triad            = $name_seq[5];<br>> >>> ><br>> >>> ><br>> >>> > 5) == é comparador numérico:<br>> >>> ><br>> >>> > perl -E 'my $a = "b"; say $a == "a"'<br>> >>> ><br>> >>> > Sempre que os dois valores estiverem preenchidos por valores não<br>> >>> > numéricos irá retornar 1 (verdadeiro).<br>> >>> ><br>> >>> ><br>> >>> > 6) = é atribuição de valor:<br>> >>> ><br>> >>> > if ( my $x = "oi" ) { print $x }<br>> >>> ><br>> >>> > Sempre irá atribuir o valor do lado direito à variável e validar esse<br>> >>> > valor. Se for 0 ou undef, será falso, para todas as outras existe<br>> >>> > mastercard.. ops.. será verdadeiro.<br>> >>> ><br>> >>> ><br>> >>> > 7) Você atribuiu um valor a @T em 2 condições, qual seria o valor de<br>> >>> > @T caso elas não fossem atendidas?<br>> >>> ><br>> >>> ><br>> >>> > Dito isso, e pedindo ajuda aos monges caso eu tenha escrito alguma<br>> >>> > besteira, vamos à resposta da sua pergunta.<br>> >>> ><br>> >>> > Vejo algumas soluções de imediato:<br>> >>> ><br>> >>> > 1) Utilização de HASH, onde o valor em comum às linhas seria a chave:<br>> >>> ><br>> >>> > push @{ $hash{">AAEL000511-PA"}, "S327,E453,H567";<br>> >>> ><br>> >>> > Claro, isso com as variáveis no lugar das constantes.<br>> >>> > Isso implica em memória, então você avalia se vale a pena.<br>> >>> ><br>> >>> ><br>> >>> > 2) Utilização de uma variável temporária para armazenar a linha atual<br>> >>> > e ser lida junto com a próxima:<br>> >>> ><br>> >>> > my $linha_anterior;<br>> >>> ><br>> >>> > while ( my $linha_atual = <$f> ) {<br>> >>> ><br>> >>> >  if ( defined $linha_anterior ) {<br>> >>> >      print $linha_anterior . $linha_atual;<br>> >>> >      undef $linha_anterior;<br>> >>> >   }<br>> >>> >   else {<br>> >>> >      $linha_anterior = $linha_atual;<br>> >>> >   }<br>> >>> ><br>> >>> > }<br>> >>> ><br>> >>> ><br>> >>> > 3) Faça nova leitura do stream (mais elegante, IMHO):<br>> >>> ><br>> >>> > while ( my $linha_anterior = <$f> ) {<br>> >>> >   my $linha_atual = <$f>;<br>> >>> > }<br>> >>> ><br>> >>> ><br>> >>> > 4) Existem outras maneiras...<br>> >>> ><br>> >>> ><br>> >>> > É isso...<br>> >>> ><br>> >>> > 2012/6/2 André Torres <andretorresrj@gmail.com>:<br>> >>> >> oi pessoal,<br>> >>> >><br>> >>> >> estou com uma duvida.<br>> >>> >><br>> >>> >> eu estou extraindo duas colunas de um arquivo texto, mas gostaria de<br>> >>> >> deixar<br>> >>> >> elas organizadas em apenas em uma linha e nao em duas como estoa no<br>> >>> >> arquivo<br>> >>> >> original. nao sei como fazer para o que eu li na primeira linha ser<br>> >>> >> colocado<br>> >>> >> junto o que for lido na segunda.<br>> >>> >><br>> >>> >> ai embaixo vai um exemplo da entrada e da saida que eu estou tendo e a<br>> >>> >> que<br>> >>> >> eu queria.<br>> >>> >><br>> >>> >> obrigado.<br>> >>> >><br>> >>> >> input:<br>> >>> >> Q#1 - >AAEL000511-PA     specific    catalytic triad    S327,E453,H567<br>> >>> >> 3    3    29383<br>> >>> >> Q#1 - >AAEL000511-PA     specific    substrate binding pocket<br>> >>> >> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571    13<br>> >>> >> 13    29383<br>> >>> >><br>> >>> >> output que estou tendo:<br>> >>> >> AAEL000511-PA S327,E453,H567<br>> >>> >> AAEL000511-PA<br>> >>> >> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571<br>> >>> >><br>> >>> >> output desejado:<br>> >>> >>>AAEL000511-PA | S327,E453,H567 |<br>> >>> >>> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571<br>> >>> >><br>> >>> >> codigo:<br>> >>> >><br>> >>> >> open (READ, "$hmm_name") or die ("Error: $!");<br>> >>> >><br>> >>> >> while (<READ>)<br>> >>> >> {<br>> >>> >>     if ($_ =~/^Q#/) {<br>> >>> >>        @name_seq = split (" ", $_);<br>> >>> >>        $name_seq = $name_seq[2];<br>> >>> >>        $triad = $name_seq[5];<br>> >>> >>        }<br>> >>> >>        if ($triad == "triad"){<br>> >>> >>        @T = $name_seq[-4];<br>> >>> >>        }<br>> >>> >>            elsif ($triad = "binding"){<br>> >>> >>            @T = $name_seq[-4];<br>> >>> >>            }<br>> >>> >> print "@T\n";<br>> >>> >> }<br>> >>> >> close (READ);<br>> >>> >><br>> >>> >><br>> >>> >><br>> >>> >> --<br>> >>> >> André Torres<br>> >>> >><br>> >>> >> "Quando o homem aprender a respeitar até o menor ser da criação, seja<br>> >>> >> animal<br>> >>> >> ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante."<br>> >>> >> (Albert<br>> >>> >> Schweitzer - Nobel da Paz de 1952)<br>> >>> >><br>> >>> >> _______________________________________________<br>> >>> >> Rio-pm mailing list<br>> >>> >> Rio-pm@pm.org<br>> >>> >> http://mail.pm.org/mailman/listinfo/rio-pm<br>> >>> ><br>> >>> ><br>> >>> ><br>> >>> > --<br>> >>> > Gabriel Vieira<br>> >>> > _______________________________________________<br>> >>> > Rio-pm mailing list<br>> >>> > Rio-pm@pm.org<br>> >>> > http://mail.pm.org/mailman/listinfo/rio-pm<br>> >>> _______________________________________________<br>> >>> Rio-pm mailing list<br>> >>> Rio-pm@pm.org<br>> >>> http://mail.pm.org/mailman/listinfo/rio-pm<br>> >><br>> >><br>> >><br>> >><br>> >> --<br>> >> André Torres<br>> >><br>> >> "Quando o homem aprender a respeitar até o menor ser da criação, seja<br>> >> animal ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante."<br>> >> (Albert Schweitzer - Nobel da Paz de 1952)<br>> ><br>> ><br>> ><br>> ><br>> > --<br>> > André Torres<br>> ><br>> > "Quando o homem aprender a respeitar até o menor ser da criação, seja animal<br>> > ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante." (Albert<br>> > Schweitzer - Nobel da Paz de 1952)<br>> ><br>> > _______________________________________________<br>> > Rio-pm mailing list<br>> > Rio-pm@pm.org<br>> > http://mail.pm.org/mailman/listinfo/rio-pm<br>> <br>> <br>> <br>> -- <br>> Gabriel Vieira<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>