1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #!/usr/local/bin/perl
use strict;
use warnings;
my $amorce = 'ATGGTMCAGATTCRCHTTC';
my @a_amorce = split ('', $amorce);
my %correspondances =
(
'R' => ['A', 'G'],
'K' => ['G', 'T'],
'S' => ['C', 'G'],
'W' => ['A', 'T'],
'M' => ['A', 'C'],
'Y' => ['C', 'T'],
'D' => ['A', 'G', 'T'],
'V' => ['A', 'C', 'G'],
'B' => ['C', 'G', 'T'],
'H' => ['A', 'C', 'T'],
'N' => ['A', 'C', 'G', 'T'],
);
my $amorce_cle = '';
my @a_recup;
recup_amorce ($amorce, $amorce_cle );
map {print "=> ".$_."\n";}@a_recup;
sub recup_amorce{
# amorce de départ
my $amorce = $_[0];
# début déjà créé de l'amorce sans les dégénérescences
my $amorce_cle = $_[1];
# longueur de l'amorce clé
my $l = length($amorce_cle);
# on récupère la fin de $amorce qui n'a pas encore été traitée
my $restant = substr ($amorce, $l);
print "$amorce\t$amorce_cle\t$restant\n";
# si il reste encore des nucléotides à traiter
if(length($restant) > 0){
my @a_nucleotides = split ('', $restant);
# pour chacun des nucléotides, on regarde si il faut le traiter ou non
foreach my $nucleotide (@a_nucleotides){
# si le nucléotide est une base dégénérées
if (exists $correspondances{$nucleotide}){
# on va récupérer toutes les valeurs possibles
foreach my $deg (@{$correspondances{$nucleotide}}){
$amorce_cle .= $deg;
recup_amorce($amorce, $amorce_cle);
}
}
# si le nucléotide ne doit pas être modifié
# on l'ajoute tel quel
else{
$amorce_cle .= $nucleotide;
}
}
}
# séquence de l'amorce terminée
# récupération dans un array
else{
push (@a_recup, $amorce_cle);
}
} |
Partager