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

Langage Perl Discussion :

bloc de code


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut bloc de code
    J'aimerais pouvoir refaire un bloc de code est-ce possible? Comment faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	BLOC ALIGN :
    	{
     
     
                  if (...){
     
                       REDO ALIGN
     
                  }
            }
    Merci,
    -- Jasmine --

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    c'est à dire ? J'ai pas bien saisi ce que tu veux faire.

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par djibril Voir le message
    c'est à dire ? J'ai pas bien saisi ce que tu veux faire.
    Je voudrais pouvoir refaire une portion de code qui n'est pas une boucle.

    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
    	BLOC ALIGN :
    	{
    		my @sort_sequences;
     
    		for my $l (0..$#sequences){
     
    			if (defined $sequences[$l]){
    				push (@sort_sequences, @{$sequences[$l]});
    			}
    		}
     
     
     
     
    		for my $l (1..$#sort_sequences){
     
    		}
     
                    # if(...) {refaire le bloc avec @sequences qui a été modifié}
           }
    -- Jasmine --

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    avec goto.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my $toto = 0;
     
    TUTU : {
      print "bloc\n";
      $toto++;
      goto TUTU while ($toto <= 5);
    }
    print "fin\n";

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci, je vais y regarder.
    -- Jasmine --

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Comme il est interdit d'utiliser goto, il faut utiliser redo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my $toto = 0;
     
    TUTU : {
      print "bloc\n";
      $toto++;
      redo TUTU while ($toto <= 5);
    }
    print "fin\n";
    S'il n'y a pas d'ambigüité sur la boucle, le label est optionnel.

    Comme indiqué dans le manuel de "redo" :
    Note that a block by itself is semantically identical to a loop
    that executes once. Thus "redo" inside such a block will
    effectively turn it into a looping construct.

    See also "continue" for an illustration of how "last", "next",
    and "redo" work.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci pour votre aide.


    J'obtiens l'erreur
    Can't locate object method "REDO" via package "ALIGN" (perhaps you forgot to load "ALIGN"?) at CW_diff_seq_length3.pl line 172.

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    	ALIGN : {
     
    		my @sort_sequences;
     
    		for my $l (0..$#sequences){
     
    			if (defined $sequences[$l]){
    				push (@sort_sequences, @{$sequences[$l]});
    			}
    		}
     
    		my $consensus;
     
     
     
    		for my $l (1..$#sort_sequences){
     
    			# si aucun alignement n'existe
    			# on aligne $sort_sequences[$l] avec $sort_sequences[$l-1]
    			if (!defined $consensus){
    				$consensus = &undef_consensus ($l, \@unalign_seq, \@sort_sequences);  
    			}
     
    			# si un consensus existe
    			# on l'aligne avec la séquence suivante
    			else{			
    				# Or one can pass the factory an alignment and one or more unaligned
    				$consensus = &def_consensus ($sort_sequences[$l],$consensus, \@unalign_seq, \@sort_sequences);
    			}
    		}
     
     
    		# si rien n'est trouvé on recommence sans la première séquence 
    		if (!defined $consensus) {
     
    			# si il restait au moins 3 séquences
    			if (@sort_sequences > 3){
     
    				# on remet la liste des séquences non alignées à zéro
    				@unalign_seq = ();
     
    				# ajout de la première séquence à la liste
    				push @delete_acc, $sort_sequences[0];		
     
    				# suppression de la première séquence dans les séquences à traiter
    				shift @sort_sequences;
     
    				# REDO avec le nouveau @sort_sequences contenant une séquence en moins
    				REDO ALIGN;
    			}
    			else {
    				push (@orga_without_consensus, $orga);
    			}
     
    		}
    		else {
    			# on indique dans le fichier log les séquences qui n'ont pas été prises
    			if (@delete_acc != 0){
    				print $log_fh ($orga." **\t".@delete_acc."\t".$tot_seq."\t");
    				foreach my $val (@delete_acc){
    					my ($id, $seq) = split /_/, $val;
    					print $log_fh "$id  ";
    				}
    				print $log_fh "\n";
    			}
    			if (@unalign_seq != 0){
    				print $log_fh ($orga."\t".@unalign_seq."\t".$tot_seq."\t");
    				foreach my $val (@unalign_seq){
    					my ($identity, $id, $seq) = split /_/, $val;
    					$identity = sprintf ("%.2f", $identity);
    					print $log_fh "$id ($identity) ";
    				}
    				print $log_fh "\n";
    			}
     
    			print $cons_fh ">".$orga."_consensus\n$consensus\n";
    		}
    	}
    Où est mon erreur? Merci.
    -- Jasmine --

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Perl est sensible à la casse, REDO et redo ne sont pas la même chose.

    --
    Jedaï

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Perl est sensible à la casse, REDO et redo ne sont pas la même chose.

    --
    Jedaï
    Merci ça fonctionne très bien maintenant.
    -- Jasmine --

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pourrais-je savoir pourquoi goto est interdit ? Merci.

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    goto n'est pas recommandé en C, je vois pas pourquoi il ne le serait pas dans les autres langages (il destructure les langages structurés ; en l'occurrence, il permet de violer les règles d'une boucle et permettant d'aller "n'importe où", y compris dans une autre boucle, alors que redo, last sont des fonctionnalités de boucle).
    En cherchant bien, il doit bien exister une règle dans le PBP pour ça
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    -- Jasmine --

  13. #13
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par djibril Voir le message
    Pourrais-je savoir pourquoi goto est interdit ? Merci.
    Je ne dirais pas qu'il est interdit, mais il est rarement nécessaire, et il est toujours préférable d'utiliser l'un des contrôles de boucle à la portée et au sens plus restreint, controlé si c'est possible.
    Evidemment il y a l'exception du "goto &sub" qui n'a de goto que le nom et peut-être utilisé pour implémenter une récursivité terminale à la fonctionnelle, ou certaines autres astuces tels qu'un AUTOLOAD invisible.

    --
    Jedaï

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Ok, merci pour vos réponses.

  15. #15
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Pour ma curiosité, pourquoi ce bloc ne doit pas être une boucle ?
    Ce bloc de code ne pourrait-il pas être une fonction qui va retourner un état, et on boucle tant qu'on n'a pas l'état attendu ?

    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while ($i == 1) {
     $i = &align;
    }
    ...
    sub align {
    ......
    return(1) #a la place de redo
    }
    Comme ca on peut réutiliser le bloc de code comme on veut, des fois qu'une seule passe serait suffisante pour certains cas.

    @+
    Mr6

  16. #16
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Bien sur que tu peux écrire une fonction... surtout si tu sens qu'elle sera ré-utilisable ailleurs.
    Tu peux d'ailleurs écrire ta boucle encore plus simplement :
    Mais j'attire ton attention sur le fait que terminer une fonction dans une boucle ou un bloc de code avec un return (ou, en d'autres termes, terminer une fonction à plusieurs endroits dans cette fonction), n'est pas forcément une bonne chose. C'est notamment, il me semble, une règle de codage pour les logiciels aéronautiques (DO178) : un seul return par fonction. Cela permet, par exemple, de ne pas oublier de traiter des bouts de code situés entre une boucle et le return terminal de la fonction.

    Cela dit, c'est couramment utilisé.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection complète d’un bloc de code
    Par jproto dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 25/05/2008, 21h11
  2. Réponses: 8
    Dernier message: 26/03/2008, 11h23
  3. un bloc de code executé une seule fois ?
    Par root76 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/08/2006, 18h24
  4. Réponses: 6
    Dernier message: 22/09/2005, 16h59
  5. [VB6] mise en commentaire d'un bloc de code
    Par JuanDeLaPlaya dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 15h05

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