¿Cómo usar caracteres alternativos de claves en los hashes de Perl como teclas también?

StackOverflow https://stackoverflow.com/questions/9319460

  •  26-10-2019
  •  | 
  •  

Pregunta

Mi código:

use strict;  
use warnings;

my $seq = "ATGGT[TGA]G[TA]GC";  
print "The sequences is $seq\n";  
my %regex = (  
   AG => "R",  
   TC => "Y",  
   GT => "K",  
   AC => "M",  
   GC => "S",  
   AT => "M",  
   CGT => "B",  
   TGA => "D",  
   ACT => "H",  
   ACG => "V",  
   ACGT => "N"  
);  

$seq =~ s/\[(\w+)\]/$regex{$1}/g;  
print "$seq\n";  

Mi salida ideal es: ATGGTDGMGC pero en el escenario anterior, dado que mi clave hash está en y no TA, no se ejecuta. Una forma de resolver este problema sería agregar otro valor clave: ta => "m". Pero no puedo hacer esto para todos los pares de valor clave, ya que hay demasiadas posibilidades.

Entonces, ¿hay una mejor manera de abordar este problema?

Gracias..

¿Fue útil?

Solución

Supongo que quieres decir que el orden de las cosas en los soportes no es importante, así que AT es equivalente a TA, y TAG equivalente a TGA, etc.

Tenga en cuenta que el otro Eric hizo una suposición diferente. No tenías mucho claro lo que querías.

Podrías ordenar las letras.

sub key { join '', sort split //, $_[0] }

my @subs = (
   AG => "R",
   TC => "Y",
   GT => "K",
   AC => "M",
   GC => "S",
   AT => "M",
   CGT => "B",
   TGA => "D",
   ACT => "H",
   ACG => "V",
   ACGT => "N",
);  

my %subs;
while (@subs) {
    my $key = shift(@subs);
    my $val = shift(@subs);
    $subs{ key($key) } = $val;
}

# Die on unrecognized
$seq =~ s/\[(\w+)\]/ $subs{ key($1) } or die $1 /ge;

o

# Do nothing on unrecognized
$seq =~ s/\[(\w+)\]/ $subs{ key($1) } || $1 /ge;

Otros consejos

Perl no tiene forma de saber que la clave AT significa lo mismo que TA A menos que lo digas de alguna manera. Si todas sus secuencias se pueden revertir, entonces podría hacer algo como:

for (keys %regex) {
   $regex{reverse $_} = $regex{$_}
}

Probablemente también debería verificar para asegurarse de que no está sobrescribiendo las claves existentes.

Alternativamente, puede modificar el Regex:

$seq =~ s/\[(\w+)\]/$regex{$1} or $regex{reverse $1}
        or die "pattern $1 not found"/ge;  

Nuevamente, ambos ejemplos suponen que todas sus claves pueden revertirse. Si no, entonces tendrá que ingresar las reversiones manualmente o desarrollar algún tipo de criterios de selección para la reversión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top