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