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 :

tri complexe Transformée Schwartzienne


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 tri complexe Transformée Schwartzienne
    J'ai une série de noms de fichiers que j'aimerais afficher par ordre du numéro commençant chaque nom.

    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
    use strict;
    use warnings;
     
     
    my @fasta_files = qw [
    	38_ATGTGTCGTGCGTTTATGCC_GTGTCGTAATGTCGTATGCGTA_456.fsa
    	39_TTGTCGTGAATATACTGTCTATGGTAC_TTGCCAGAGGATGTGCCGTT_818.fsa
    	6_TTGCGTTAACGGTGGCGCTC_TGTCATGTCACTGTCGAT_1397.fsa
    	93_GGCGTGATACAGAGGGGTCA_TCTCATATGCGTGTCATACTCCTGT_912.fsa
    ];
     
    my %h_cles;
    my $organisme  = 'Escherichia_coli';
     
     
    # Schwartzian Transform
    my @out = sort {
    	$a =~ /^(\d+)_/;
    	$b =~ /^(\d+)_/;
    	$a <=> $b;
    } @fasta_files;
     
    foreach my $file (@out){
    	if($file =~ /(\d+)_([A-Z]+_[A-Z]+)_\d+/){
    		$h_cles{$1."_".$organisme}= $2;
    		print "\t\'".$1."_".$organisme."\' => \'".$2."\',\n";
    	}
    }
    ... il me semble qu'il existe une façon plus simple de procéder, mais je ne me souviens plus laquelle Pourriez-vous m'aider?


    Merci,
    -- Jasmine --

  2. #2
    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
    Je ne dirais pas "plus simple", mais plus efficace (probablement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @out = map { $_->[1] } 
      sort { $a->[0] <=> $b->[0] }
      map { /^(\d+)_/; [ $1, $_ ] } @fasta_files;
    Mais en fait, si tu désactives le warning numérique, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @out = do { no warnings "numeric"; sort { $a <=> $b } @fasta_files };
    Remarque que c'est exactement ce que tu faisais (sauf que tu extrayais le nombre mais tu ne l'utilisais pas) mais tu avais probablement des warnings, non ?

    --
    Jedaï

  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 Jedai
    mais tu avais probablement des warnings, non ?
    Oui, tout à fait. Je vais utiliser ta seconde proposition avec le no warnings.

    Je ne comprends pas la première
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @out = map { $_->[1] } 
      sort { $a->[0] <=> $b->[0] }
      map { /^(\d+)_/; [ $1, $_ ] } @fasta_files;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map { /^(\d+)_/; [ $1, $_ ] } @fasta_files
    Le $1 contient le chiffre récupéré et $_ la valeur entière du nom de fichier.
    que fait [ $1, $_ ] ? Il récupère le chiffre qu'il associe au nom dans un array anonyme.

    Ensuite on fait un tri numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort { $a->[0] <=> $b->[0] }
    $a et $b se rapporte donc au $1 précédent vu l'indice [0]

    Mais que fait ?
    Met-il dans @out le tri récupéré? $_->[1]
    car dans map { /^(\d+)_/; [ $1, $_ ] }, $1 correspond à $_->[0] et $_ à $_->[1]
    Comment ce map équivaut-il à un puch @out?



    Merci beaucoup pour ton aide
    -- Jasmine --

  4. #4
    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
    j'ai un problème étrange


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my @out = do { no warnings "numeric"; sort { $a <=> $b } @fasta_files };  
     
     
    foreach my $file (@out){
    	if($file =~ /(\d+)_([A-Z]+_[A-Z]+)_\d+/){
    		$h_cles{$1."_".$organisme}= $2;
    		print "\t\'".$1."_".$organisme."\' => \'".$2."\',\n";
    	}
    }
    Ce code fonctionne parfaitement si je lui donne 'manuellement' l'array @fasta_files.

    Par contre si je récupère @fasta_files via un readdir ... le tri ne se fait plus correctement !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		opendir(DIR, $rep);
    		my @fasta_files = grep { !/^\.\.?$/ } readdir(DIR);
    		closedir(DIR);
     
    		my @out = do { no warnings "numeric"; sort { $a <=> $b } @fasta_files };  
     
     
    		foreach my $file (@out){
    			if($file =~ /(\d+)_([A-Z]+_[A-Z]+)_\d+/){
    				$h_cles{$1."_".$organisme}= $2;
    				print "\t\'".$1."_".$organisme."\' => \'".$2."\',\n";
    			}
    		}
    Comment est-ce possible?

    Parce que si je fais dans ce code précédent un map{"$_\n"} @fasta_files ... en ayant récupérer les données via readdir, puis que je crée manuellement l'array @fasta_files par un qw[copier-coller], je réexécute le code et il fonctionne ... le tri est bien numérique.


    Merci beaucoup,
    -- Jasmine --

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

Discussions similaires

  1. Tri complexe avec xsl:sort
    Par jesemeatoutvent dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/01/2009, 21h53
  2. tri complex ?
    Par CKLN00 dans le forum Langage
    Réponses: 14
    Dernier message: 22/07/2008, 09h15
  3. Réponses: 6
    Dernier message: 14/06/2008, 17h46
  4. tri complexe mysql
    Par jeroen dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/11/2007, 17h42
  5. Tri complexe sur une table
    Par fwdavy dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/11/2007, 23h40

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