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 :

recherche de positions dans un mot


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 recherche de positions dans un mot
    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
    #!/usr/local/bin/perl
     
    use strict;
    use List::AllUtils qw( indexes );
     
     
    my $consensus = '   AKWAYBKTGADRDWANDVYKWAWAS';
     
    # suppression des espaces du consensus
    $consensus =~ s/\s//g;
     
    # positions des nucléotides n'étant ni A, ni T, ni C ni G
    my @positions_deg = indexes { $_ !~ m/[ATCG]/ } split //, $consensus;
     
    # positions en comptant à partir de 1
    map {print $_ + 1 .", ";} @positions_deg;
    Voici un script qui me renvoie les positions des lettres n'étant ni A, ni T, ni C ni G. La première lettre du mot ayant la position 1.

    Je me demandais par curiosité à quelles façons différentes auriez-vous pensé, peut-être un grep et la recherche de la position de motif ($-[1]).

  2. #2
    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
    J'aurais sans doute fait comme toi.

    Pour m'amuser, voici une autre façon d'aboutir au résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print 1 + length ${^PREMATCH}), ", " while $consensus =~ /[^ATCG]/g
    Voire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $consensus =~ s/[^ATCG]/print 1+length ${^PREMATCH}, ", "/ge;
    print $consensus;

  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
    Oui, c'est les vacances de Pacques, il faut s'amuser comme on peut, c'est mort le forum en ce moment.

    Merci pour tes solutions, ça me fait découvrir de nouvelles choses en Perl mais cela ne fonctionne pas chez moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print (1 + length ${^PREMATCH}), ", " while $consensus =~ /([^ATCG])/g;
    Je ne connais pas ${^PREMATCH}, y a-t-il une condition particulière pour l'utiliser? J'ai essayé de modifier ton expression en ajoutant des parenthèses mais ça ne fonctionne toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/local/bin/perl
     
    use strict;
     
     
    my $consensus = '   AKWAYBKTGADRDWANDVYKWAWAS';
     
    print (1 + length ${^PREMATCH}), ", " while $consensus =~ /([^ATCG])/g;
    print (...) interpreted as function at test.pl line 8.
    Useless use of a constant in void context at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    Use of uninitialized value in length at test.pl line 8.
    11111111111111111111

  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 : 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
    Je suis allé plus loin en testant plusieurs configs :

    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
    use strict;
    use List::AllUtils qw( indexes );
     
     
    my $consensus = '   AKWAYBKTGADRDWANDVYKWAWAS';
     
    # suppression des espaces du consensus
    $consensus =~ s/\s//g;
     
    print $consensus, "\n";
    print "Positions of [^ATCG]\n";
     
    sub a {
      # positions des nucléotides n'étant ni A, ni T, ni C ni G
      return indexes { $_ !~ m/[ATCG]/ } split //, $consensus;
    }
     
    sub b {
      my @pos;
      push @pos, length ${^PREMATCH} while $consensus =~ /[^ATCG]/g;
      return @pos;
    }
     
    sub c {
      my @pos;
      push @pos, pos($consensus) while $consensus =~ /[^ATCG]/g;
      return @pos;
    }
     
    a() foreach 1 .. 10000;
    my @positions_def = a();
    # positions en comptant à partir de 1
    map {print $_ + 1 .", ";} @positions_def;
    print "\n";
     
    b() foreach 1 .. 10000;
    @positions_def = b();
    # positions en comptant à partir de 1
    map {print $_ + 1 .", ";} @positions_def;
    print "\n";
     
    c() foreach 1 .. 10000;
    @positions_def = c();
    # positions en comptant à partir de 1
    map {print $_ .", ";} @positions_def;
    print "\n";
    (aide pour ${^PREMATCH} : perldoc perlvar en perl 5.10)

    Voici le résultat du profiling:
    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
    $ perl -d:DProf positions.pl && dprofpp -rI
    AKWAYBKTGADRDWANDVYKWAWAS
    Positions of [^ATCG]
    2, 3, 5, 6, 7, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 23, 25,
    2, 3, 5, 6, 7, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 23, 25,
    2, 3, 5, 6, 7, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 23, 25,
    Total Elapsed Time = 1.615408 Seconds
             Real Time = 1.615408 Seconds
    Inclusive Times
    %Time ExclSec CumulS #Calls sec/call Csec/c  Name
     59.9   0.229  0.969  10001   0.0000 0.0001  main::a
     45.8   0.740  0.740  10001   0.0001 0.0001  List::MoreUtils::indexes
     21.4   0.347  0.347  10001   0.0000 0.0000  main::b
     19.6   0.318  0.318  10001   0.0000 0.0000  main::c
     3.28   0.005  0.053      3   0.0017 0.0178  main::BEGIN
     1.49   0.013  0.024      5   0.0026 0.0047  List::AllUtils::BEGIN
     1.18   0.015  0.019      3   0.0050 0.0063  English::BEGIN
     0.43   0.001  0.007      4   0.0002 0.0017  Exporter::import
     0.37       -  0.006      1        - 0.0059  English::import
     0.31   0.005  0.005      2   0.0025 0.0025  Exporter::as_heavy
     0.25   0.004  0.004      4   0.0010 0.0010  Errno::BEGIN
     0.19       -  0.003      9        - 0.0003  Config::FETCH
     0.19   0.001  0.003      2   0.0005 0.0015  List::Util::BEGIN
     0.12   0.002  0.002      3   0.0007 0.0007  vars::BEGIN
     0.12   0.002  0.002      6   0.0003 0.0003  AutoLoader::BEGIN

  5. #5
    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
    L'usage de pos() est la plus véloce, et retourne directement le bon indice.

  6. #6
    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
    Comment as-tu réalisé le profiling? Utilises-tu parfois le module Benchmark?

    Il y a quelques temps, nous avions proposé avec Djibril de mettre au point des tests en Perl, de poser un problème et qu'on discute des différentes possibilités de le résoudre, je me demande ce que cette idée est devenue . Cela existe déjà sur d'autres parties du forum.

  7. #7
    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
    Je ne connais pas benchmark. J'utilise généralement DProf et dprofpp en générant des fonctions pour chaque bout de code à mesurer, et en l'appelant un certain nombre de fois si l'opération dure un temps court.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -d:DProf mon_script.pl && dprofpp -Ir
    En revanche, l'idée de mettre en place des tests, je ne l'ai pas vu passée. Peux-tu développer le concept ? C'est pour tester quoi et dans quel but ?

  8. #8
    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 Philou67430 Voir le message
    En revanche, l'idée de mettre en place des tests, je ne l'ai pas vu passée. Peux-tu développer le concept ? C'est pour tester quoi et dans quel but ?
    Ca date d'y il y a longtemps, je n'ai plus retrouvé le post en question dans lequel on en discutait. Faudrait voir avec Djibril si il a gardé ou concrétisé cette idée. Je pense qu'on peut s'inscrire dans une liste et participer à ce genre de défis en multi-language sur une autre partie du forum. L'idée était donc que tous les x temps on propose un nouveau problème et que ceux qui veulent s'amuser se casse la tête à essayer de le résoudre, le but étant de comparer les différents scripts et d'en discuter, coder pour le plaisir de coder .

  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
    Dans ce genre là que tu connais déjà :
    http://www.developpez.net/forums/f75...-fonctionnels/


    ... mais ça serait peut-être un double emploi inutile et puis il faut trouver quelqu'un de motivé qui régulièrement propose des énigmes.

  10. #10
    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
    Ah ok... les défis.
    C'est intéressant, mais je ne peux malheureusement pas y consacrer suffisamment de temps.

Discussions similaires

  1. [Excel] changer la position d'un mot dans une cellule
    Par VlaMonPseudo dans le forum Excel
    Réponses: 3
    Dernier message: 25/07/2007, 16h05
  2. recherche d'une chaîne dans 360000 mots
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 06/04/2007, 13h48
  3. Réponses: 4
    Dernier message: 08/01/2007, 23h38
  4. retrouver la position d'un mot dans un TCanvas
    Par richard038 dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2006, 10h17
  5. [PERL] connaitre la position d'une lettre dans un mot
    Par LE NEINDRE dans le forum Langage
    Réponses: 3
    Dernier message: 24/03/2006, 16h03

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