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 :

[EXPREG] liste de positions


Sujet :

Langage Perl

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut [EXPREG] liste de positions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	# recherche des positions des nucléotides dégénérés
    	if(my @positions = $seq_cons =~ /([^ATCG])/ig){
    		map{print "$_\n";} @positions;
    	}
    Dans ce code, je récupère les motifs trouvés. Je sais qu'il y a moyen de récupérer la position des motifs via $-[0], $-[1], $-[2] ... mais comment les faire entrer dans ma liste? Je n'ai besoin que des positions et non des valeurs récupérées.


    Merci pour votre aide,

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    J'ai une solution mais existe-il plus simple?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	my $i = 0;
     
    	# afin de ne pas modifier ma séquence consensus
    	my $copy_seq = $seq_cons;
     
    	# recherche des positions des nucléotides dégénérés
    	while ($copy_seq =~ s/([^ATCG])//i){
    		print $-[0] + $i."\n";
    		$i += 1;
    	}



    Merci,

  3. #3
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$-[0]\n" while $seq_cons =~ m/[^ATCGatcg]/g;
    --
    Jedaï

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Si j'ai bien compris, la boucle while s'effectue sur la liste renvoyée grâce au //g.


    Merci pour ton aide.

  5. #5
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Si j'ai bien compris, la boucle while s'effectue sur la liste renvoyée grâce au //g.
    Non, m//g se comporte différemment en contexte scalaire ou de liste, ici il est en contexte scalaire, ce qui signifie qu'il ne fait qu'un match à la fois.
    Plus exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $result = ($str =~ m/match1/g); # seul le premier match1 est renvoyé
    $result = ($str =~ m/match2/g); # si le match1 a réussi, alors match2 est essayé après la fin du match1
    alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @result = ($str =~ m/match1/g); # tous les match1 sont renvoyés
    @result = ($str =~ m/match2/g); # que le match1 est réussi ou non, le match2 est essayé depuis le début de $str et tous les matchs sont renvoyés
    Le résultat c'est qu'on peut utiliser un while en conjonction avec m//g pour faire une boucle sur l'ensemble des matchs dans une string (mais il n'y a jamais de liste créée, les matchs sont examinés un à un).

    On peut également utiliser ce système pour faire un lexeur lisible en Perl.

    --
    Jedaï

  6. #6
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    En fait on peut dire, si cela peut t'aider à comprendre le mécanisme, que l'opérateur de match est (ou agit comme) un itérateur.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code Jedai : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $result = ($str =~ m/match1/g); # seul le premier match1 est renvoyé
    $result = ($str =~ m/match2/g); # si le match1 a réussi, alors match2 est essayé après la fin du match1

    Je ne comprends pas ce que tu veux dire car même si la première expreg échoue /U/, la seconde est évaluée /H/.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $str = 'atgtcgRatgtaccgHtgagct';
     
    # 1) contexte de scalaires
    my $result = ($str =~ m/U/g); # seul le premier match1 est renvoyé
    $result = ($str =~ m/H/g); # si le match1 a réussi, alors match2 est essayé après la fin du match1
    print "2 => $result\n";		# 1
    Dans ce contexte scalaire, je n'obtiens que des 1 ... je ne vois pas le lien entre le match1 et le match2 pour qu'il y en ait un il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (my $result = ($str =~ m/match1/g)){
    	$result = ($str =~ m/match2/g); # si le match1 a réussi, alors match2 est essayé après la fin du match1
    	print "2 => $result\n";		
    }

    Citation Envoyé par Jedai
    On peut également utiliser ce système pour faire un lexeur lisible en Perl.
    Un nouveau mot à mon vocabulaire
    Lexeur. Affiner le filtrage avec des mots clés

  8. #8
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Ce que veux dire Jedaï, je crois, est qu'en contexte liste l'ensemble des mtach est réalisé et donc tu ne peux pas reprendre là où tu en étais (puis que tu as épuisé les matchs possibles) alors qu'en contexte scalaire, tu procèdes match par match (c'est que j'ai appelé un itérateur).

  9. #9
    Expert confirmé
    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
    Par défaut
    Essaye de lire la section "Global matching" de ce paragraphe de perlretut, il explique ce que je t'ai montré, plus ou moins.

    --
    Jedaï

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # The modifier //g  stands for global matching and allows the matching operator
    # to match within a string as many times as possible.
     
    # But what if we had an indeterminate number of words? 
    # To extract all words loop over all matches with /(\w+)/g :
     
    my $seq = "sagtachtrc";
     
    while ($seq =~ /([^atcgATCG])/g) {
    	print "Letter is $1, ends at position ", pos $seq, "\n";
    }
    J'ai bien compris que dans ce contexte scalaire, les motifs sont trouvés un à un. Contrairement au contexte de liste où //g renvoie en une fois l'ensemble des motifs trouvés.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my @sequences = ("atgtvcgta", "atgtcgata", "gatgtmtagtcn");
     
    # If you don't want the position reset after failure to match, add the //c , as in /regexp/gc . 
    foreach my $s (@sequences){
    	while ($s =~ /([^atcgATCG])/gc) {
    		print "Letter is $1, ends at position ", pos $s, "\n";
    	}
    }
    Qu'appelle-t'on exactement un échec à trouver le motif? Est-ce dans une même séquence ou est-ce pour une liste de séquences? Dans mon script que j'utilise //g ou //gc ... cela ne change rien. Pourtant toutes les lettres de mes séquences ne match pas et même sans le //c, pos $s n'est jamais remis à zéro. Pourrais-tu me donner un petit script montrant l'utilité de //c?



    Merci beaucoup,

  11. #11
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Qu'appelle-t'on exactement un échec à trouver le motif? Est-ce dans une même séquence ou est-ce pour une liste de séquences? Dans mon script que j'utilise //g ou //gc ... cela ne change rien. Pourtant toutes les lettres de mes séquences ne match pas et même sans le //c, pos $s n'est jamais remis à zéro. Pourrais-tu me donner un petit script montrant l'utilité de //c?
    Avec mon histoire de lexeur par exemple.
    Il y a de meilleures façon de faire ça, mais supposons qu'on veuille lexer une somme en une devise inconnue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $gold = "17 £";
     
    my $how_much = ($gold =~ m/(\d+)\s*/g);
    if( $gold =~ m/£/gc ) {
      print "$how_much pounds\n";
    } 
    elsif( $gold =~ m/$/gc ) {
      print "$how_much dollars\n";
    } 
    elsif( $gold =~ m/€/gc ) {
      print "$how_much euros\n";
    }
    C'est un exemple à la con, mais dans des cas plus complexes, le /gc peut être intéressant.

    --
    Jedaï

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci pour les explications.

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

Discussions similaires

  1. Compatibilité list-style-position outside sur tablette
    Par thais781 dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 18/12/2013, 09h36
  2. [XL-2003] Liste et position des métadonnées d'une photo
    Par BBe8127 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/03/2013, 08h44
  3. Réponses: 10
    Dernier message: 06/05/2011, 11h36
  4. list style position inside et margin left
    Par SpaceFrog dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 16/07/2009, 10h23
  5. [SHELL API] Liste des Icônes dans le casier (et position)..
    Par ARDILLER dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/05/2005, 13h37

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