Debutant en Perl.Probleme de programmation
Bonjour, pour mon travail un programmeur m'a fait ce petit programme en Perl le pb est que le pg ne fait pas reellement ce que je veux.Vu que je suis debutant c'est tres complique de le modifier pour reparer l'erreur.
Ce que je voudrais c'est extraire des donnees d'une database qui se decompose de la maniere suivante:
1/Informations sur la sequence
2/Localisation des differentes parties de la sequence
3/Sequence a proprement parle.
Ce que je souhaite,c'est extraire une partie de l'info pour connaitre d'ou provient la sequence,de prendre chaque partie de la sequence a part et ensuite de prendre la sequence complete encore a part.
Voici le programme que j'ai(j'ai egalement le fichier data lie a ce programme) pourriew vous me dire si deja il y a une erreur dans ce programme SVP...
Merci!!:? :P
Code:
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #!/usr/bin/perl
# oblige utiliser la dÈclaration de variable pour chaque nouvelle variable (my $variable;)
use strict;
# explique les bugs
use warnings;
# le path du fichier dans une variable
my $genbank = "all_GenBank.txt";
# j'ouvre le fichier (||) ou je meurs
open (FILE, "$genbank") || die "salop\n";
# je stoque chaque ligne du fichier comme une string dans un array (liste)
my @lines_gb = <FILE>;
close FILE;
## dÈclaration des variables que je vais utiliser
my $line;
my $locus;
my $definition;
my $translation = 0;
my $seq;
my $complete_seq;
my $start_cds;
my $start;
my $end;
my $product = "";
my $protein_id;
my $prot_seq;
# boucle pour chaque ligne du fichier
foreach $line (@lines_gb){
# si la string de $line match avec un truc qui commence (^) par "LOCUS"
if ($line =~ m/^LOCUS/){
# je split ma string en liste et je prend le deuxiËme ÈlÈment de la liste ([1] parceque Áa commence zero)
$locus = (split(/\s+/,$line))[1];
# j'enlËve le caractËre invisible de saut de ligne de ma string
chomp $locus;
}
if ($line =~ m/^DEFINITION/){
$definition = $line;
# definition est egal la ligne qui commence par DEFINITION et je substitue DEFINITION du dÈbut et tous les espaces juste aprËs (\s 1 esapce, \s+ groupe d'espaces ou de tabulateurs)
$definition =~ s/^DEFINITION\s+//;
# je virre (remplace par rien) partir de ", complete et tout autre caractËre aprËs"
$definition =~ s/, complete.*//;
# je remplace les espaces par "_" le "g" c'est pour qu'il le fasse pas juste avec le premier, mais avec tous
$definition =~ s/ /_/g;
chomp $definition;
# je crÈ le repertoire qui portera le nom du virus
mkdir "data/$definition";
}
# si ya "translation dans la ligne ou si la variable translation est Ègale 1"
if (($line =~ m/\/translation\=\"/)|($translation == 1)){
# je dÈfini translation 1
$translation = 1;
$seq = $line;
#je remplace tout ce qu'il y a avant translation et translation et "=" et """, le "\" c'est pour qu'il sache qu'on parle d'un caractËre normal, pas d'un truc special comme .*
$seq =~ s/.*\/translation\=\"//;
$seq =~ s/\s+//g;
chomp $seq;
# je rajoute la string $seq $complete_seq
$complete_seq = $complete_seq.$seq;
# c'est la fin de la sÈquence je remet translation 0
if ($seq =~ m /\"/){
$translation =0;
$complete_seq =~ s/\"//;
}
}
if ($line =~ m/3\'UTR/){
# fin de la sÈquence, on initialise...
$complete_seq = "";
}
# je garde les valeur de dÈbut et de fin de la protÈine
if ($line=~ m/mat\_peptide/){
$start = $line;
$start =~ s/.*mat\_peptide\s+//;
$start =~ s/\s+//g;
$end = $start;
$start =~ s/\.\..*//;
$end =~ s/.*\.\.//;
chomp $end;
print "$start $end\n";
}
# je garde la valeur de dÈbut de la CDS
if ($line=~ m/ CDS /){
$start_cds = $line;
$start_cds =~ s/.*CDS\s+//;
$start_cds =~ s/\s+//g;
$start_cds =~ s/\.\..*//;
}
# je garde le nom de proteine et l'id
if ($line=~ m/\/product/){
$product = $line;
$product =~ s/.*\/product\=\"//;
$product =~ s/\"\n//g;
$product =~ s/ /_/g;
}
# j'Ècris dans un fichier le nom et l'id, et la sÈquence de la protÈine
if (($line=~ m/\/protein_id/)&($product !~ m/polyprotein/)){
$protein_id = $line;
$protein_id =~ s/.*\/protein_id\=\"//;
$protein_id =~ s/\"\n//g;
$protein_id =~ s/ /_/g;
# j'ouvre le fichier de sortie
open (FILE, ">data/$definition/$product");
print FILE "\>$product\t$protein_id\n";
my $temp = $complete_seq;
# et oui c'est les coordonnÈes nuclÈiques...
my $tmpstart = int(($start-$start_cds)/3);
my $tmpend = (($end-$start_cds+1)/3)-$tmpstart;
# substring chope la strin qui va de $tmpstart et qui fait $tmpend de long
$prot_seq = substr($temp, $tmpstart, $tmpend);
print FILE "$prot_seq\n";
close FILE;
}
}
# \n retour la ligne
print "tadam!!!\n\n" |