Como se indica en la página de manual de reverse(), que te enlacé, los valores, al ser pasados a claves, son eliminados los que sean duplicados. O mejor dicho: solo queda en el nuevo diccionario las últimas claves que sean únicas.
El caso que pones, no te vale con hacer una inversión del diccionario.
Lo mejor será que construyas el diccionario mirando todas las claves y almacenándoles en otra forma, como nuevos valores. Es decir: deseas que, dado un aminoácido, obtener qué codones lo codifican. La cuestión ahora es saber cómo meter varios codones en un valor de diccionario.
Una solución sería meterlos en un arreglo. Así, tendremos un diccionario de arreglos.
Con el siguiente programa:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
# Diccionario aminoácido <- codones
my (%aminoacido_del_codon) = (
'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
);
# Creación del diccionario codones <- aminoácido
my %codones_del_aminoacido;
foreach my $codon (keys %aminoacido_del_codon) {
push @{$codones_del_aminoacido{$aminoacido_del_codon{$codon}}}, $codon;
}
use Data::Dumper;
print Dumper \%aminoacido_del_codon, \%codones_del_aminoacido;
__END__
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
la salida es
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> ./code_19585.pl
$VAR1 = {
'GCC' => 'A',
'AGT' => 'S',
'TGA' => '_',
'TGT' => 'C',
'CGA' => 'R',
'ATC' => 'I',
'AAC' => 'N',
'AGC' => 'S',
'TAC' => 'Y',
'ACA' => 'T',
'TCG' => 'S',
'CCG' => 'P',
'CTG' => 'L',
'GCA' => 'A',
'GTG' => 'V',
'AAG' => 'K',
'GTT' => 'V',
'CAC' => 'H',
'AGA' => 'R',
'ACC' => 'T',
'CCA' => 'P',
'TGG' => 'W',
'CTC' => 'L',
'CGC' => 'R',
'TTG' => 'L',
'TAA' => '_',
'CAG' => 'Q',
'ACG' => 'T',
'AAA' => 'K',
'ATG' => 'M',
'GTA' => 'V',
'TAG' => '_',
'CTT' => 'L',
'GGA' => 'G',
'GTC' => 'V',
'TGC' => 'C',
'TCA' => 'S',
'ATT' => 'I',
'TAT' => 'Y',
'AAT' => 'N',
'ACT' => 'T',
'CAA' => 'Q',
'GAC' => 'D',
'GGT' => 'G',
'TCC' => 'S',
'TTT' => 'F',
'AGG' => 'R',
'CGT' => 'R',
'ATA' => 'I',
'CGG' => 'R',
'CAT' => 'H',
'CCC' => 'P',
'GGG' => 'G',
'TTA' => 'L',
'GAG' => 'E',
'CTA' => 'L',
'GAT' => 'D',
'TCT' => 'S',
'TTC' => 'F',
'GCG' => 'A',
'GGC' => 'G',
'GCT' => 'A',
'GAA' => 'E',
'CCT' => 'P'
};
$VAR2 = {
'F' => [
'TTT',
'TTC'
],
'S' => [
'AGT',
'AGC',
'TCG',
'TCA',
'TCC',
'TCT'
],
'T' => [
'ACA',
'ACC',
'ACG',
'ACT'
],
'N' => [
'AAC',
'AAT'
],
'K' => [
'AAG',
'AAA'
],
'E' => [
'GAG',
'GAA'
],
'Y' => [
'TAC',
'TAT'
],
'V' => [
'GTG',
'GTT',
'GTA',
'GTC'
],
'Q' => [
'CAG',
'CAA'
],
'M' => [
'ATG'
],
'C' => [
'TGT',
'TGC'
],
'L' => [
'CTG',
'CTC',
'TTG',
'CTT',
'TTA',
'CTA'
],
'A' => [
'GCC',
'GCA',
'GCG',
'GCT'
],
'W' => [
'TGG'
],
'P' => [
'CCG',
'CCA',
'CCC',
'CCT'
],
'_' => [
'TGA',
'TAA',
'TAG'
],
'H' => [
'CAC',
'CAT'
],
'D' => [
'GAC',
'GAT'
],
'I' => [
'ATC',
'ATT',
'ATA'
],
'R' => [
'CGA',
'AGA',
'CGC',
'AGG',
'CGT',
'CGG'
],
'G' => [
'GGA',
'GGT',
'GGG',
'GGC'
]
};
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Fíjate que ahora tenemos agrupados todos los codones correspondientes a cada aminoácido. Ahora podemos sacar información de esta estructura de datos:
Using perl Syntax Highlighting
print "Codones del aminoácido 'R': ", join(" ", @{$codones_del_aminoacido{R
}}), "\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Using text Syntax Highlighting
Codones del aminoácido 'R': CGA AGA CGC AGG CGT CGG
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
La sintaxis se puede enrevesar un poco para el neófito, pero es fácil si se mira poco a poco:
$codones_del_aminoacido{R} : estamos accediendo al valor correspondiente a la clave 'R' dentro del diccionario %codones_del_aminoacido. Ese valor sabemos que es siempre un arreglo, por lo que podemos acceder a los elementos de ese arreglo con '@':
@{$codones_del_aminoacido{R}}.
Podríamos incluso acceder a solo el primer codón:
@{$codones_del_aminoacido{R}}[0],
$codones_del_aminoacido{R}->[0] o
$codones_del_aminoacido{R}[0]. La salida es siempre la misma: 'CGA'.
Recomendable la lectura de perldoc
perldsc, sección
HASHES-OF-ARRAYS.