Re: [Rio-pm] extraindo strings de um arquivo
Gabriel e Breno, muito obrigado pela ajuda. no caso da duplicação de resultados, eu vou precisar manter pq senao vou perder dados. entao eu guardei a sua dica sobre como filtrar os dados duplicados (eu testei e ela funcionou) pra utilizar em outro script. vai ser super útil. =D eu entendi os passos da variavel temporária, fiz um script e deixei separado com essa estrutura caso eu precise. agora eu preciso pegar os outros scripts que eu fiz e montar um workflow do tipo que a saida de um programa vai ser a entrada do outro. vou quebrar a minha cabeça e qualquer duvida venho pedir ajuda aos mestres. abraço. André Torres. Em 4 de junho de 2012 06:41, Aureliano Guedes escreveu: > 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 ' > > push @array, $key unless exists $hash{$key};' você resolveu. Obrigado, > acabastes de me ajudar sem eu pedir. > > > > From: gabriel.vie...@gmail.com > > Date: Mon, 4 Jun 2012 01:57:05 -0300 > > To: rio-pm@pm.org > > Subject: Re: [Rio-pm] extraindo strings de um arquivo > > > > > 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 : > > > 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 > > > 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]} .='
Re: [Rio-pm] extraindo strings de um arquivo
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 ' push @array, $key unless exists $hash{$key};' você resolveu. Obrigado, acabastes de me ajudar sem eu pedir. > From: gabriel.vie...@gmail.com > Date: Mon, 4 Jun 2012 01:57:05 -0300 > To: rio-pm@pm.org > Subject: Re: [Rio-pm] extraindo strings de um arquivo > > 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 : > > 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 > > 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 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#/; > >>&
Re: [Rio-pm] extraindo strings de um arquivo
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 : > 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 > 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 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 : >>> > 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 pe
Re: [Rio-pm] extraindo strings de um arquivo
Vamos lá então.. Pra ordenar sugiro que você guarde as chaves encontradas em um @array.. então para imprimir na ordem em que foram encontradas é só percorrer o @array, obter o valor e utilizá-lo como chave no %hash. Para evitar chaves repetidas, antes de adicionar ao array, verifique se a chave em questão já existe, e consequentemente já foi adicionada ao array: push @array, $key unless exists $hash{$key}; Simples. Você pode utilizar tied hash também.. Quanto à solução que você não entendeu, acredito ser a 2a sugestão, ela consiste em: A variável temporária está definida? Sim: Então ela é definida pela conteúdo da linha anterior, devo trabalhar com ela e com a linha que estou lendo agora e depois aplicar undef sobre a variável temporária. Não: Então devo definí-la com o conteúdo da linha que estou lendo e pular o programa para a próxima linha. Ficou mais claro? Abraços, 2012/6/4 André Torres : > 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 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 : >> > 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 atendid
Re: [Rio-pm] extraindo strings de um arquivo
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 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 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 : >> > 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 $l
Re: [Rio-pm] extraindo strings de um arquivo
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 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 : > > 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 : > >> oi pessoal, > >> > >> estou com uma duvida. > >> > >> eu estou extrai
Re: [Rio-pm] extraindo strings de um arquivo
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 : > 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 : >> 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 () >> { >> 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 >> Rio-pm@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > > > -- > Gabriel Vieira > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] extraindo strings de um arquivo
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 : > 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 () > { > 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 > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm -- Gabriel Vieira ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] extraindo strings de um arquivo
2012/6/2 André Torres : > nao sei como fazer para o que eu li na primeira linha ser colocado > junto o que for lido na segunda. > Tirar o "\n" do seu print? ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
[Rio-pm] extraindo strings de um arquivo
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 specificcatalytic triadS327,E453,H567 3329383 Q#1 - >AAEL000511-PA specificsubstrate binding pocket G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I57113 1329383 *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 () { 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 Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm