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 :

regexp et compte d'éléments


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 regexp et compte d'éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                       3'-TGAACGTACACTTTCCGGA-5'
                          x|x||||x||
              5'-GCGAAATAAGCATGCAAGT-3'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                       3'-GGTACGTACATAATCCGTGTG-5'
                          |||||||x||
              5'-AGGCCTACCACATGCAAGT-3'

    J'aimerais compter le nombre de pipes successifs qui commence au début.

    Pour le premier exemple, ce serait donc 0 et pour le second, ce serait 7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	if (${$h_ref}{'Seq1'} =~ m/^\s+3/){
     
    		# on compte le nombre de pipes successifs en 3'
    		my ($pipes) = ${$h_ref}{'Pipes'} =~ m/^\s+(\|*)/;
    		my @array_pipes = split '', $pipes;
     
    		if (int(@array_pipes) >= $pipes_threshold){
    			...
    		}
    	}
    Ce code fonctionne, avec ${$h_ref}{'Seq1'} contenant la première ligne (3'-GGTACGTACATAATCCGTGTG-5') et ${$h_ref}{'Pipes'} contenant la ligne des pipes.

    Il doit y avoir moyen de faire plus simple, je pense à quelque chose de ce genre, mais il ne faut pas compter les pipes à l'extrémité droite après la croix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $count = () = ${$h_ref}{'Pipes'} =~ m/[\s\|](\|)/g;
    Il faudrait donc une regexp qui recherche individuellement les pipes du début et qui s'arrête quand on trouve une croix.


    Avez-vous une idée pour la regexp ou une autre solution qu'une regexp?

  2. #2
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    bon ce n'est pas très beau mais quelque chose du style fonctionnerait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $count = 0;
    if(${$h_ref}{'Pipes'} =~ /^\s*(\|+)/){
      $count = length($1);
    }

  3. #3
    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
    Je n'avais pas pensé à la fonction length(), c'est plus joli que de passer par un array comme je le fais. En attendant de trouver mieux, je vais utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		my ($pipes) = ${$h_ref}{'Pipes'} =~ m/^\s+(\|*)/;
    		my $count = length($pipes);
    Merci pour ton message.

  4. #4
    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 : 59
    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
    Par défaut
    Beniou, je ne vois pas en quoi ce n'est pas joli... tu veux dire que ce serait mieux en une seule instruction, comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $count = length([ ${$h_ref}{'Pipes'} =~ m/^\s+(\|*)/ ]->[0]);
    @jasmine : tu pourras ainsi analyser cette forme d'utilisation des références anonymes immédiatement déréférencées

  5. #5
    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
    Citation Envoyé par Philou67430 Voir le message
    @jasmine : tu pourras ainsi analyser cette forme d'utilisation des références anonymes immédiatement déréférencées
    Attends que je relise déjà 3 fois cette phrase avant de penser l'avoir comprise. ^^ Il me reste le WE pour plancher dessus.

    Sans vouloir parler de plus 'joli' mais de plus 'efficace' comment savoir ce qui est préférable? Existe-t-il des règles simples? Le plus court n'étant pas toujours le plus efficace, comment peut-on savoir?

  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 : 59
    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
    Par défaut
    En l'occurrence, les deux écritures ont strictement la même complexité algorithmique.
    La première utilise une variable nommée et deux instructions successives, tandis que la deuxième passe par une variable anonyme en une seule instruction.
    En code machine, ça doit être quasiment identique.

    Donc je te conseille d'utiliser celle que tu comprends le mieux, celle qui est le plus facilement maintenable dans ton contexte.

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

Discussions similaires

  1. Compte d'élément d'une branche
    Par RLS dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/06/2009, 18h32
  2. Fonction qui compte le nombre d'éléments.
    Par bakomen dans le forum Débuter
    Réponses: 1
    Dernier message: 12/06/2009, 09h19
  3. Réponses: 1
    Dernier message: 06/05/2009, 00h40
  4. Extraire un élément faisant partie d'une variable dans une regexp
    Par byrdo dans le forum Programmation et administration système
    Réponses: 9
    Dernier message: 17/04/2009, 15h21
  5. Réponses: 11
    Dernier message: 19/07/2006, 18h28

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