Bonjour,

J'aimerais savoir comment optimiser ce script. Je sais qu'imbriquer des boucles n'est pas l'ideal. J'ai pensé à la fonction map sur mes array mais je ne vois pas comment l'utiliser.
Mon programme compare des chaines de caractères et compte de nombre de lettres communes (la position est importante).

par exemple

ATCGC
ACCGT

3 lettres identiques à la même position

J'aimerais aussi garder les informations récupérées dans un tableau ayant pour clé chacune des chaînes de caractères analysées et en valeur la liste des séquences étant identique à une lettre près. Est-ce possible sans devoir passer par un objet complexe?


Merci,


Jasmine,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
#!/usr/local/bin/perl
 
 
use strict;
use warnings;
use Data::Dumper;
 
#----------------------------------------- IdentiteAmorces.pl -----------------------------------------#
 
 
# contient en clé la séquence et en valeur son numéro de référence
my %Hash =      (
                        "ATGTCCTGTCCGTG" => 0,
                        "ATCTCCTGTCCGTG" => 1,
                        "ATGTCCTGGACGTG" => 2,
                        "ATCTCCTGGACGTG" => 3,
                        "ATCTCCTGTCCGTA" => 4
                );
 
# Pour chaque couple possible d'amorces, calcul du nombre de nucléotides commun
# Chaque amorce mise dans une array par un split @Amorce_ref et @Amorce
 
my %Hash_Identite;
 
foreach my $Seq_ref (keys %Hash)
{
        my @Amorce_ref = split ("", $Seq_ref);
        my @Liste_Amorces; # liste des amorces ayant un pourcentage d'identité supérieur au seuil
        foreach my $Seq (keys %Hash)
        {
                unless ($Seq eq $Seq_ref)
                {
                        my @Amorce = split ("", $Seq);
                        my $Identite = 0; # compte des nucléotides communs
                        for (my $i=0; $i<@Amorce_ref; $i++)
                        {
                                if ($Amorce_ref[$i] eq $Amorce[$i])
                                {
                                        $Identite++;
                                }
                        }
                        # print "$Seq_ref\t$Seq\tidentité : $Identite\n";
                        my $Seuil = @Amorce_ref-2;
                        print "Seuil : $Seuil\n";
                        if ($Identite>=$Seuil){push (@Liste_Amorces, $Seq)}
                }
        }
        my $Ref_Liste_Amorces = \@Liste_Amorces;
        $Hash_Identite{$Seq_ref}= $Ref_Liste_Amorces;
}
 
print Dumper %Hash_Identite;
 
close;