[Rio-pm] extraindo strings de um arquivo
Gabriel Vieira
gabriel.vieira em gmail.com
Sábado Junho 2 14:17:37 PDT 2012
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
Mais detalhes sobre a lista de discussão Rio-pm