Sí, hay varios problemas...
mutar_codon() devuelve todas las mutaciones como un valor escalar. Al ponerlo en la línea 55 entrecomillado doble, estamos haciendo un despliegue del contenido del arreglo @mutaciones. Algo así como que la línea
Using perl Syntax Highlighting
return "@mutaciones";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
fuera
Using perl Syntax Highlighting
return join $", @mutaciones;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Como, por defecto,
$" vale un carácter espacio, pues el resultado es un escalar en que los codones aparecen juntos en una cadena de caracteres, separados por un espacio en blanco entre cada dos de ellos. Bueno, no hay problema porque eso es justo lo que queremos para dárselo al usuario.
Fíjate, que estás llamando dos veces a mutar_codon(). Una en la línea 9, para informar al usuario, y otra en la 20, para hacer el cálculo.
Y además, en la línea 20 estás intentando ahora leer un arreglo de lo que te devuelve mutar_codon(). Ahí está el fallo gordo, pues mutar_codon() solo devuelve un escalar.
Una primera solución sería hacer un split() del valor escalar, ya que sabemos el aspecto que tiene (el descrito antes). Así, la línea 20 quedaría:
Using perl Syntax Highlighting
my @codones_para_traducir = split " ", mutar_codon($arg_codon);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y ya tenemos a todos los codones.
Es más, como el resultado ya lo hemos calculado antes, en realidad lo podemos dejar en
Using perl Syntax Highlighting
my @codones_para_traducir = split " ", $imprimir;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En la línea 30 devolvemos el resultado:
Using perl Syntax Highlighting
return keys %aminoacidos;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo hace como una lista de valores, por el efecto de keys(). El problema está ahora en la línea 12, ya que estás indicando que lo quieres en realidad es un valor escalar, para luego informar al usuario. Así que necesitamos arreglar esto.
Una solución sería modificar la línea 30 para que devuelva el resultado como un escalar que espera el usuario:
Using perl Syntax Highlighting
return join " ", sort keys %aminoacidos;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya está. El sort() es un aderezo para que la salida de los aminoácidos salga ordenada.
El programa, un poco más limpio, y con un par de cambios más, quedaría:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
my (%codigo_genetico) = (
'TCA' => 'S', # Serina
'TCC' => 'S', # Serina
'TCG' => 'S', # Serina
'TCT' => 'S', # Serina
'TTC' => 'F', # Fenilalanina
'TTT' => 'F', # Fenilalanina
'TTA' => 'L', # Leucina
'TTG' => 'L', # Leucina
'TAC' => 'Y', # Tirosina
'TAT' => 'Y', # Tirosina
'TAA' => '_', # Stop
'TAG' => '_', # Stop
'TGC' => 'C', # Cisteina
'TGT' => 'C', # Cisteina
'TGA' => '_', # Stop
'TGG' => 'W', # Triptófano
'CTA' => 'L', # Leucina
'CTC' => 'L', # Leucina
'CTG' => 'L', # Leucina
'CTT' => 'L', # Leucina
'CCA' => 'P', # Prolina
'CCC' => 'P', # Prolina
'CCG' => 'P', # Prolina
'CCT' => 'P', # Prolina
'CAC' => 'H', # Histidina
'CAT' => 'H', # Histidina
'CAA' => 'Q', # Glutamina
'CAG' => 'Q', # Glutamina
'CGA' => 'R', # Arginina
'CGC' => 'R', # Arginina
'CGG' => 'R', # Arginina
'CGT' => 'R', # Arginina
'ATA' => 'I', # Isoleucina
'ATC' => 'I', # Isoleucina
'ATT' => 'I', # Isoleucina
'ATG' => 'M', # Metionina
'ACA' => 'T', # Treonina
'ACC' => 'T', # Treonina
'ACG' => 'T', # Treonina
'ACT' => 'T', # Treonina
'AAC' => 'N', # Asparagina
'AAT' => 'N', # Asparagina
'AAA' => 'K', # Lisina
'AAG' => 'K', # Lisina
'AGC' => 'S', # Serina
'AGT' => 'S', # Serina
'AGA' => 'R', # Arginina
'AGG' => 'R', # Arginina
'GTA' => 'V', # Valina
'GTC' => 'V', # Valina
'GTG' => 'V', # Valina
'GTT' => 'V', # Valina
'GCA' => 'A', # Alanina
'GCC' => 'A', # Alanina
'GCG' => 'A', # Alanina
'GCT' => 'A', # Alanina
'GAC' => 'D', # Ácido aspártico
'GAT' => 'D', # Ácido aspártico
'GAA' => 'E', # Ácido glutámico
'GAG' => 'E', # Ácido glutámico
'GGA' => 'G', # Glicina
'GGC' => 'G', # Glicina
'GGG' => 'G', # Glicina
'GGT' => 'G', # Glicina
);
print "Introduzca un codón: ";
my $codon = <STDIN>;
chomp $codon;
my $mutaciones = mutar_codon($codon);
print "\nHe aquí las posibles mutaciones individuales que puede sufrir su codón: $mutaciones", "\n\n";
print "Y aquí tenemos los aminoácidos que codifica cada codón mutado: ", traducir_cada_codon($mutaciones), "\n\n";
sub mutar_codon {
my ($codon)= @_;
$codon = uc $codon;
my @bases = qw(A C G T);
my @mutaciones;
for (my $i= 0; $i<3; $i++) {
foreach my $base (@bases) {
my $mutacion = $codon;
if ($base eq substr($codon, $i, 1)) {
next; # No mutamos si la $base es igual a lo que ya tenemos en el codón
}
else {
substr($mutacion, $i, 1, $base); # Mutamos el codón cambiando la base $i-ésima por la nueva $base
}
push @mutaciones, $mutacion;
}
}
return "@mutaciones"; # Devolvemos las mutaciones separadas por la variable $" (espacio, por defecto)
}
sub traducir_cada_codon {
my ($codones_mutados) = @_;
my %aminoacidos;
my @codones_para_traducir = split " ", $codones_mutados;
foreach my $elemento (@codones_para_traducir) {
$aminoacidos{ traduccion($elemento) }++;
}
return join " ", sort keys %aminoacidos;
}
sub traduccion {
my ($codon) = @_;
$codon = uc $codon;
if (exists $codigo_genetico{$codon}) {
return $codigo_genetico{$codon};
}
else{
print STDERR "ERROR:\n\"$codon\" no es un codón\n";
exit;
}
}
__END__
Coloreado en 0.007 segundos, usando
GeSHi 1.0.8.4