Re: [Rio-pm] extraindo strings de um arquivo

2012-06-06 Por tôpico André Torres
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

2012-06-04 Por tôpico Aureliano Guedes

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

2012-06-03 Por tôpico Gabriel Vieira
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

2012-06-03 Por tôpico Gabriel Vieira
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

2012-06-03 Por tôpico 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 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

2012-06-03 Por tôpico 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 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

2012-06-02 Por tôpico breno
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

2012-06-02 Por tôpico 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


Re: [Rio-pm] extraindo strings de um arquivo

2012-06-02 Por tôpico breno
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

2012-06-02 Por tôpico 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 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