Hola a todos.
Tengo un problema con un
script que tengo que hacer en Perl. Llevo muchos días intentando solucionarlo pero no hay manera. Ahí va:
Tengo una lista en .txt formada por una columna de tipo de factor de transcripción (TF) y otra formada por sus aminoácidos. ej:
Using text Syntax Highlighting
TF1 ATLHLSNIPPSVTMDDLKNLFEAGCSVKAFKFFQKDRKMALIQLGSVEEAIQALIELHNHDLGENHHLRVSFSKS
TF1 ATLHLSNIPPSVTVDDLKNLFEAGCSVKAFKFFQKDRKMALIQLGSVEEAIQALIELHNHDLGENHHLRVSFSKS
TF1 ATLHLSNIPQNVTEDDLRLLFNTGGTVKAFKFFQDRKMALIQMSTVEEAIQALIDLHNYNMGGNQHLRVSFSKS
TF2 GKMFVGGLSWDTSKKDLKDYFTKFGDVSDCTIKFDSDSGRSRGFGFVLFKDPSSVEKVLQQKEHRLDGRLIDPKRAMAMKKEPV
TF2 GKMFVGGLSWDTSKKDLKDYFTKFGEVSDCTIKFDSDSGRSRGFGFVLFKDPSSVKKVLEQKEHRLDGRLIDPQRAMAMKKEPV
TF3 GKMFVGGLSWDTSKKDLKDYFTKFGEVTDCTIKMDPNTGRSRGFGFILFKEPGSVEKVLEQKEHRLDGRLIDPKKAMAMKKDPVKK
[etc]
Lo que necesito es simple: tengo que conseguir que me lea los aminoácidos de cada TF, distinga qué TF es y me los agrupe en ese TF cada a.a. con su frecuencia. Para ello sé que tengo que trabajar con
hashes y eso. Mi problema es que de Perl controlo más bien poco, pero bueno, ahí va lo que llevo escrito hasta ahora:
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
my $arg0 = $ARGV[0];
if ( !$arg0 ){
print STDERR "Usage: $0 file_name\n";
exit(0);
}
open(FILE,"<$arg0") or die("cannot open $arg0");
while (<FILE>){
chomp;
my ($id, $seq) = split("\t", $_);
my $i=0;
my %TF1;
if ( $id eq 'TF1') {
my @TF1_aa = split(//,$seq);
# for(my $i=0; $i < scalar(@TF1_aa); $i++){
# $TF1{$TF1_aa[$i]}++;
# esto es lo que nos han dado como ejemplo para trabajar pero con esto el hash se llena con TODOS los aminoácidos de la lista sin distinguir el tipo de TF. Así pues, cambié a if/elsif pero dentro de estas condiciones veo que no puedo declarar un for y por ello pasé a while
while ($i < scalar(@TF1_aa)){ $i++;
$TF1{$TF1_aa[$i]}++};
my @aa = keys( %TF1 );
my @aa_count = values( %TF1 );
print "@aa\n";
print "@aa_count\n";
# estos print los pongo para poder ver cómo está trabajando el script y si está haciendo lo que quiero o no
} elsif ($id eq 'TF2') {
# aquí repito lo anterior pero cambiándolo por $TF2 y así elsif con todos los tipos que tengo en la lista
Vale, pues ejecutando este
script me da el siguiente
output:
Using text Syntax Highlighting
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 1.
S F T N K E Y V Q M C L A P D R I G
1 6 6 4 2 5 5 4 6 2 1 1 6 5 2 7 7 3 6
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 2.
F S T N K E Y V Q L A W P D R I G
1 4 3 2 4 2 7 3 7 1 4 8 1 3 5 8 2 9
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 3.
F S T K E Y V Q C L A W P D R I G
1 4 4 2 2 6 2 9 1 1 4 7 1 3 7 10 3 7
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 4.
F S T N K E Y V Q L A P H D I R G
1 5 3 1 2 5 6 3 5 1 6 2 1 2 8 5 7 8
[...]
y así hasta que termina con todas las líneas en las que
$id eq 'TF1'.
Pues eso, quiero que me las agrupe todas dentro del
hash %TFn y no me vaya dando el resultado una a una sin almacenarlas.
Muchas gracias por adelantado.