[Rio-pm] extraindo strings de um arquivo

breno breno em rio.pm.org
Sábado Junho 2 14:34:00 PDT 2012


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 <gabriel.vieira em gmail.com>:
> 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 <andretorresrj em gmail.com>:
>> 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
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
> --
> Gabriel Vieira
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm


Mais detalhes sobre a lista de discussão Rio-pm