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
