IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

Erreurs de syntaxe..


Sujet :

Bioinformatique Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Erreurs de syntaxe..
    Bonjour,
    Je reviens vers vous concernant mon second code, qui, comme le premier, ne fonctionne pas.
    Voici la bête :
    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
    #!C:\strawberry\perl\bin -W
    use warnings;
    use stricts;
    open HIN, "<C:\\Users\\Maxime\\Desktop\\sequence.txt";
    my @temp = <HIN>;
    my $a =0
    for (my $j=0 ; $j<=($#temp) ; $j+=1){ 
    my @t = split //, $temp[$j];
    for (my $c=0; $c<=($#t);$c+=1){
    		if (($t[$c] =~ 'a')&&($t[$c+1] =~ 't')&&($t[$c+2] =~ 'g')){
    				for (my $i=$c+1; $i<=($#t);$i+=1){
    					if ($t[$i] =~ 'g') && ($t[$i+1] =~ 't'){
    						for (my $v=$i+1; $v<=($#t);$v+=1){
    							if ($t[$v] =~ 'a')&&($t[$v+1]=~ 'g'){
    																$a+=1
    								print("exon", "$a",":","$t[$c..$i-1]\n","intron", "$a", ":","$t[$i..v+1]\n")
     
    								}
    							elsif (($t[$v] =~ 't')&&($t[$v+1] =~ 'g')&&($t[$v+2] =~ 'a')){								
    								print ("exon unique :","$t[$c..$v+2]")
    								last}
    							elsif (($t[$v] =~ 't')&&($t[$v+1] =~ 'a')&&($t[$v+2] =~ 'a')){								
    								print ("exon unique :","$t[$c..$v+2]")
    								last}
    								};}
    					elsif (($t[$i] =~ 't')&&($t[$i+1] =~ 'g')&&($t[$i+2] =~ 'a')){
    					print ("exon unique :","$t[$c..$i+2]")
    					}};}};}
    Et voici mes problèmes :
    ==> pour afficher une suite de ligne d'un tableau par exemple de la ligne 1 à 10, comment doit-on si prendre? print ($t[1..10]) ne semble pas fonctionner.
    ==>Ensuite je veux que le programme me trouve trois nucléotides (ATG) à la suite puis qu'il commence à faire d'autre action (chercher des introns ou une fin TAA ou TGA). Pour cela j'ai utilisé if précédé d'une boucle for.. if (($t[$c] =~ 'a')&&($t[$c+1] =~ 't')&&($t[$c+2] =~ 'g')). Est-ce que cette façon d'écrire pour la condition "SI la ligne x correspond à un 'a' ET la ligne x+1 correspond à un 't' ET la ligne x+2 correspond à un 'g' ALORS ...." est correcte?.

    Bon le programme est un premier jet je suis pas sur que l'algorithme que j'ai mis en place fonctionne vraiment pour l'instant, mais avant de le vérifier j'aimerai bien résoudre ces petites questions de syntaxe ^^.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    je regarderai plus précisément ton problème ce soir ou demain matin mais n'essaies-tu pas de réinventer des choses qui existent?

    Typiquement, des logiciels dont l'algo est très bien fait permettant de prédire des gènes (par exemple) existent déjà

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Ok,merci.

    J'essais juste de faire l'exercice qu'on m'a confié ^^. Même si des logiciels existent pour ce genre de choses, mon but final est d'apprendre le perl donc ça m'entraîne un peut ^^

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Déjà, ton programme ne compile sans doute pas. Il manque un ; en ligne 6. Donc, tu ne peux pas tester ce programme

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Oui en effet x), mais les erreurs sont semblables à ce qu'elles étaient avant le rajout du ; :s j'ai notamment l'erreur de print(...) interpreted as a function line 20 23 27, ce qui me laisse penser qu'il y a un problème avec le print($t[x..y]).

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Pour imprimer les éléments d'un tableau, voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @c = 5..15;
    print "@c[2..7]"; # imprime: 7 8 9 10 11 12
    Quand tu fais une "tranche de tableau" (array slice), donc avec plusieurs éléments, tu utilises en quelque sorte un sous-tableau, il faut donc utiliser le "sigil" @ et non $.

  7. #7
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci !
    Ca fonctionne en effet sur un petit bout de code qui reprends le même tableau @t issu de "sequence.txt".
    Mais dans le code totale ça me fais encore le "print(...) interpreted as a function line 20 23 27" et aussi il me trouve une "syntaxe error line , near ") &&", line 13, near "1)", line 24, near ") last", line 26 near "elsif" " .....

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Poste ton code actuel. Il manque un ";" en ligne 15 du code ci-dessus, juste avant le print, c'est peut-être la cause de l'erreur.

  9. #9
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    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
    #!C:\strawberry\perl\bin -W
    use warnings;
    #use stricts;
    open HIN, "<C:\\Users\\Maxime\\Desktop\\sequence.txt";
    my @temp = <HIN>;
    my $a =0;
    for (my $j=0 ; $j<=($#temp) ; $j+=1){ 
    my @t = split //, $temp[$j];
    for (my $c=0; $c<=($#t);$c+=1){
    		if (($t[$c] =~ 'a')&&($t[$c+1] =~ 't')&&($t[$c+2] =~ 'g')){
    				for (my $i=$c+1; $i<=($#t);$i+=1){
    					if ($t[$i] =~ 'g') && ($t[$i+1] =~ 't'){
    						for (my $v=$i+1; $v<=$#t;$v+=1){
    							if ($t[$v] =~ 'a')&&($t[$v+1]=~ 'g'){
    								$a+=1;
    								print("exon", "$a",":","@t[$c..$i-1]\n","intron", "$a", ":","@t[$i..v+1]\n")
     
    								}
    							elsif (($t[$v] =~ 't')&&($t[$v+1] =~ 'g')&&($t[$v+2] =~ 'a')){								
    								print ("exon unique :","@t[$c..$v+2]")
    								last}
    							elsif (($t[$v] =~ 't')&&($t[$v+1] =~ 'a')&&($t[$v+2] =~ 'a')){								
    								print ("exon unique :","@t[$c..$v+2]")
    								last}
    								};}
    					elsif (($t[$i] =~ 't')&&($t[$i+1] =~ 'g')&&($t[$i+2] =~ 'a')){
    					print ("exon unique :","@t[$c..$i+2]")
    					}};}};}
    Le voilà, le ";" ligne 15 ne semble pas la source du problème :ss

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Erreur ligne 12:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($t[$i] =~ 'g') && ($t[$i+1] =~ 't'){
    devrait certainement être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (($t[$i] =~ 'g') && ($t[$i+1] =~ 't')) {
    Même erreur ligne 14.

    Erreur ligne 16:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("exon", "$a",":","@t[$c..$i-1]\n","intron", "$a", ":","@t[$i..v+1]\n")
    La fin de a ligne a besoin d'un $ devant le v:

    Erreur ligne 23: pas de ; final

    Pareil ligne 27.

    Avant ces corrections:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ perl -c test1.pl
    "my" variable $v masks earlier declaration in same statement at test1.pl line 12.
    "my" variable $v masks earlier declaration in same scope at test1.pl line 12.
    print (...) interpreted as function at test1.pl line 19.
    print (...) interpreted as function at test1.pl line 22.
    print (...) interpreted as function at test1.pl line 26.
    syntax error at test1.pl line 11, near ") &&"
    syntax error at test1.pl line 12, near "1)"
    syntax error at test1.pl line 18, near "elsif"
    syntax error at test1.pl line 23, near ")
                                                                    last"
    syntax error at test1.pl line 25, near "elsif"
    test1.pl had compilation errors.
    Et après les corrections:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -c test1.pl
    test1.pl syntax OK
    Il y aurait beaucoup d'autres choses à dire sur ce code, mais retirer les erreurs de compilation sont la première chose à faire. Et il faut toujours commencer par la première, sans oublier qu'elle est souvent due à une erreur 1 ou 2 (ou 20) lignes plus haut.

  11. #11
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup, à part les ";" j'aurai pu corriger le reste .. Maintenant il s'exécute parfaitement, je peux désormais m'attaquer aux erreurs de logique =D

  12. #12
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par schmurf Voir le message
    à part les ";" j'aurai pu corriger le reste ..
    Ben, il fallait le faire, alors...

    Quand tu développes, tu peux éventuellement te permettre de laisser de côté provisoirement un petit bug parce que tu estimes avoir plus urgent à faire.

    Mais des erreurs de compilation, non. Il faut les enlever une par une, au fur et à mesure et dans l'ordre. Pas le choix: tu ne peux rien tester ni déboguer tant que le programme ne compile pas. Et les erreurs de compilation, il faut toujours commencer par la première signalée (en n'oubliant pas que l'erreur de codage peut se situer quelques lignes plus haut que la ligne mentionnée par le compilateur), car souvent la première erreur entraîne les autres. Cette après-midi, je développais un programme au boulot. Il compilait correctement (sans erreur) et marchait. A un moment donné, j'ai ajouté un affichage complémentaire dans mon fichier résultat, relancé le programme et me suis retrouvé avec d'un seul coup 15 ou 20 erreurs de compilation, alors que je n'avais ajouté qu'une ou deux ligne(s) de code. J'avais simplement oublié le guillemet fermant de la chaîne de caractère que je voulais imprimer. Du coup, le compilateur était complètement à la ramasse et me trouvait plein d'erreurs dans la suite du programme. J'ai remis ce guillemet manquant, et toutes les erreurs ont disparu comme par enchantement. Si j'avais commencé par n'importe quelle erreur suivante, je n'avais aucune chance de trouver l'origine du problème.

    Bon, pour la logique de ton programme, je ne pourrai sans doute pas trop t'aider, n'ayant aucune idée de ce que sont des "des introns ou une fin TAA ou TGA". La dernière fois que j'ai suivi des cours de bio en fac, c'était il y a 40 ans, en 1973-74, et non seulement j'ai beaucoup oublié, mais à l'époque on n'imaginait même pas pouvoir séquencer un jour le génome d'une simple bactérie.

    Mais je voudrais aborder quelques questions de codage à la lumière de ton code source (bonnes pratiques et style)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #!C:\strawberry\perl\bin -W
    Le '-W" est une syntaxe périmée, inutile et même nuisible dans la mesure où tu as la ligne 'use warnings;' en-dessous. Le pragma 'use warnings;' fait la même chose en mieux, garde-le et supprime '-W'.

    Ne mets pas en commentaire cette ligne très importante (et qui te fera gagner un temps fou), mais corrige-la en enlevant le s à la fin de strict:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open HIN, "<C:\\Users\\Maxime\\Desktop\\sequence.txt";
    Cette méthode d'ouverture d'un fichier fonctionne encore, mais n'est plus recommandée depuis une vingtaine d'années. Voici une méthode bien meilleure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $infile =  "C:\\Users\\Maxime\\Desktop\\sequence.txt";
    open my $HIN, "<", $infile or die "impossible d'ouvrir le fichier $infile $!";
    Ici, je mets le nom du fichier dans une variable. Je pourrais la réutiliser si besoin (et j'en aurais besoin deux fois ci-dessous).
    Puis j'ouvre un file handle lexical ("my $HIN") et non un "mot nu" (bareword) cela présente toutes sortes d'avantages, par exemple si j'ai besoin de transmettre le file handle à une fon ction. Je mets le mode d'ouverture du fichier ("<") séparé du nom, c'est plus clair et préférable dans des cas particuliers. Enfin, la fin de la ligne, 'or die "impossible d'ouvrir le fichier $infile $!"' teste si le programme a pu ouvrir le fichier, et tue le programme si l'ouverture n'a pas fonctionné (ça ne sert à rien de continuer). En cas d'erreur d'ouverture, non seulement le programme merut, mais, avant cela il affiche la raison ("impossible d'ouvrir..."), le nom du fichier qui n'a pas pu être ouvert ($infile) et l'erreur système qui a eu lieu (la variable $! me dira peut-être que le fichier n'existe pas, ou le répertoire n'existe pas, ou je n'ai pas le droits, etc.). Bref, j'ai un maximum d'éléments pour pouvoir corriger.

    ou

    si j'ai modifié le file handle comme ci-dessus.

    Ici, ça marchera avec un fichier petit ou moyen, mais le problème est que tu charges dans un tableau en mémoire l'ensemble de ton fichier. Si ton fichier fait 10 gigaoctets (et ça arrivera sans doute, les fichiers de génétiques sont souvent énormes), ton programme plantera, faute de mémoire, alors qu'il n'y a aucune raison de tout charger en mémoire, tu peux te contenter de lire les lignes une par une. Tu ne consommeras pratiquement pas de mémoire (et ça ira un peu plus vite). Il suffit de remplacer les lignes suivfantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @temp = <$HIN>;
    my $a =0;
    for (my $j=0 ; $j<=($#temp) ; $j+=1){ 
    my @t = split //, $temp[$j];
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $a =0;
    while (my $ligne = <$HIN>) {
         my @t = split //, $ligne;
         # ...
    A supposer que tu aies réellement besoin de charger le fichier en mémoire dans le tableau @temp (ça arrive que l'on doive revenir en arrière, etc.), la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (my $j=0 ; $j<=$#temp ; $j+=1){ 
    my @t = split //, $temp[$j]
    dite syntaxe de style C n'est pas du tout optimale en Perl.

    La bonne syntaxe dans ce cas est plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $ligne (@temp) {
         my @t = split //, $ligne;
         # ...
    Pas besoin donc de gérer la variable de boucle $j, Perl se débrouille très bien pour te donner les lignes les unes après les autres.

    Et si vraiment tu as besoin de la variable de boucle $j parce qu'elle sert aussi à autre chose (c'est assez rare et n'est pas le cas ici), il y a encore une syntaxe plus simple (et meilleure) que la boucle for de style C que tu utilises:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $j (0..$#temp) {
         my @t = split //, $ltemp[$j];
         # ...
    Bon, si tu utilises la boucle while préconisée ci-dessus pour lire le fichier, tu peux croire ne pas avoir besoin de ces détails sur les boucles for, et, certes tu n'en n'a pas besoin pour la lecture du fichier, mais comme toutes tes autres bouckles sont construites sur le même modèle, tu peux toutes les simplifier.

    Bon, je ne vais pas examiner ainsi chacune de tes lignes, j'y passerais la nuit. Juste encore deux points.

    Sur l'utilisation de print. Tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("exon", "$a",":","@t[$c..$i-1]\n","intron", "$a", ":","@t[$i..$v+1]\n")
    La plupart de ces guillemets sont inutiles, Perl gère très bien pour toi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("exon$a:@t[$c..$i-1]\n intron$a:@t[$i..$v+1]\n")
    devrait marcher aussi bien (bon, pas testé, je n'ai pas les données, mais ça devrait marcher). C'est nettement plus lisible et facile à écrire, non?

    Et dernier point: l'indentation de ton code n'a aucun sens et te conduira à des erreurs. L'indentation n'a aucune influence sur le déroulement du programme, mais il a un rôle considérable dans la compréhension que le développeur a de son propre code. Ce n'est que du formatage de code, mais c'est essentiel pour bien travailler. N'hésite pas à demander si tu ne comprends pas ce que je veux dire.

    J'ai passé beaucoup de temps à rédiger ce post, j'espère que tu en tiendras compte. Crois-moi, c'est l'expérience qui parle, tu seras gagnant;

    OK, sur ce, bonne soirée à toi.

  13. #13
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Tout d'abord merci pour toutes ces astuces Lolo78, je n'ai pas pu répondre car j'ai pas mal de travail à faire autre que ce code.
    J'en ai édité un nouveau, en tenant compte de ce que vous m'avez écrit, ça façon de se déplacer dans le code est différente du précédent, et j'ai fais appel à une fonction pour gérer la possibilité qu'il y ai plusieurs introns. Concernant le stockage en mémoire (RAM je suppose), je préfère rester sur le système précédent notamment pour le fait que j'ai besoin de revenir en arrière à un moment.
    Le "use strict" fonctionne mais me sort un jolie tas de variable non définie alors que le programme peut s'exécuter sans le "use strict", et le "use stricts" ne fonctionne tous simplement pas et me sort l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Can't locate stricts.pm in @INC (@INC contains: C:/Dwimperl/perl/site/lib C:/Dwi
    mperl/perl/vendor/lib C:/Dwimperl/perl/lib .) at scrpt.pl line 2.
    BEGIN failed--compilation aborted at scrpt.pl line 2.
    Le fait de pouvoir tout écrire rapidement dans le print est un véritable gain de temps en effet!
    Pour l'indentation je me souviens qu'avec l'éditeur proposé en téléchargeant scilab (autre langage de programmation) permettait de corriger l'indentation automatiquement, ce qui avait le mérite d'être très très rapide, ici perl ne propose pas d'éditeur donc j'ai essayé Note pad++ et "Padre", mais aucun ne le peut, c'est bien dommage :s.

    Alors concernant mon nouveau code, le voici :
    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
    #!C:\strawberry\perl\bin 
    #use stricts;
    use warnings;
    my $a =0;
    my $infile =  "C:\\Users\\Maxime\\Desktop\\sequence.txt";
    open my $HIN, "<", $infile or die "impossible d'ouvrir le fichier $infile $!";
    my @temp = <$HIN>;
    for my $ligne (@temp) {
         my @t = split //, $ligne;
    sub f {
    my ($a,@ta) = @_;
    my $u=0;
    my @newt=0;
    for (my $i=0; $i<=($#ta);$i+=1){
    	if (($ta[$i] =~ 't')&&($ta[$i+1] =~ 'g')&&($ta[$i+2] =~ 'a')&&($i%3 ==0)){
    		for (my $v=0; $v<=($i);$v+=1){
    		if (($ta[$v] =~ 'g')&&($ta[$v+1] =~ 't')&&($v%3==0)){
    			for (my $p=0; $p<=$#ta;$p+=1){
    				if (($ta[$p] =~ 'a')&&($ta[$p+1] =~ 'g')&&(($p+1)%(1/3)==(1/3))){
    					$a +=1;
    					$u +=1;
    					print ("exon$a : @t[0..$v-1]\n","intron$a : @ta[$v..$p+1]\n");
    					my @newt= @ta[$p+1..$#ta];};};};};};
    	elsif ($u!=0){
    	print ("exon : @ta[0..$i+2]");};};
    	return (@newt)};
    for (my $c=0; $c<=($#t);$c+=1){
    		if (($t[$c] =~ 'a')&&($t[$c+1] =~ 't')&&($t[$c+2] =~ 'g')){
    			my @ta= @t[$c..$#t];			
    			my @e= f($a,@ta);
    			print ("e : @e");
    			while (@e!=0){
    			@e=f($a,@e);}
    			;};};}
    Et avec celui-ci j'obtiens deux belles syntax error line 24, near "elsif" et line 35, near ";}".
    J'ai essayé de réparer la première erreur (ligne 24), j'ai regardé avant aussi, mais, je ne vois pas d'où l'erreur peut venir...
    Voilà où j'en suis, et c'est très frustrant toutes ces erreurs lol c'est particulièrement difficile d'avancer tellement je me heurte à un pépin quelconque très souvent!

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Change la ligne juste avant le elsif comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @newt= @ta[$p+1..$#ta];};};};};}
    Enlever le ";" final corrigera tes deux erreurs de compilation.

    Mais c'est une très mauvaise idée de ne pas mettre:

    car cette instruction te signale automatiquement toutes sortes d'erreurs de codage que tu auras beaucoup plus de mal à trouver toi-même. Cette instruction t'oblige certes à déclarer tes variables, mais c'est justement une excellente chose de déclarer ses variables, car cela évite beaucoup d'erreurs subtiles.

  15. #15
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par schmurf Voir le message
    Bonjour,

    Pour l'indentation je me souviens qu'avec l'éditeur proposé en téléchargeant scilab (autre langage de programmation) permettait de corriger l'indentation automatiquement, ce qui avait le mérite d'être très très rapide, ici perl ne propose pas d'éditeur donc j'ai essayé Note pad++ et "Padre", mais aucun ne le peut, c'est bien dommage :s.
    Perl Tidy permet d'indenter correctement le code en fonction de sa structure, mais cela ne sert en fait presque jamais: c'est au développeur d'indenter correctement son code en fonction de la logique qu'il a en tête, pas à un programme automatique. C'est pour toi que tu dois le faire aussi soigneusement que possible. Cela te fera gagner un temps fou. Aucun développeur digne de ce nom, professionnel ou amateur, ne produit du code semblable à ce que tu présentes. Personnellement, jamais je n'embaucherais un développeur qui présente du code comme le tien. Et je ne répondrai plus à tes éventuelles autres questions si tu présentes encore du code aussi mal fichu.

Discussions similaires

  1. [Directives] Page blanche quand erreur de syntaxe
    Par syl2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/02/2006, 15h15
  2. [sql] erreur de syntaxe
    Par cmoa59 dans le forum JDBC
    Réponses: 14
    Dernier message: 03/05/2005, 11h41
  3. erreur de syntaxe en C++
    Par sergepmessa dans le forum C++
    Réponses: 6
    Dernier message: 11/03/2005, 18h15
  4. PHP SQL =>erreur de syntaxe (operateur absent)
    Par snipes dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 14h09
  5. erreur de syntaxe javascript dans ma page
    Par Oluha dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/02/2005, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo