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 :

chomp ou pas chomp ?


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut chomp ou pas chomp ?
    j'ai un petit probleme de chomping (j'aime les barbarismes) :
    à savoir j'ai fait un programme qui tourne impeccablement sur ma session, mais qui sur la session d'une autre personne "oublie" de chomper ce qui est plus tot TRES embétant, donc si vous avez un remède à ce genre de probleme je suis preneur.

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    c pas clair ton histoire, montre nous ton bout de code

  3. #3
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut je le savait :'(
    je savais que j'arriverais pas à être clair :s !
    bon heu pour le code voila tout le programme
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    #!/usr/local/bin/perl -w
    use strict;
    #initialisation des variables de question
    my $finData="f2 backcross" ;
    my $aliasC="1=H 0=A" ;
    my $unique=-1 ;
    my $transpo=-1 ;
    my $okey=0 ;
    my $choix = "" ;
    my $valider = "" ;
    my $hard_chomp ;
    #on se place dans le répertoire que l'utilisateur utilise pour plus de simplicité
    my $pwd=`pwd`;
    chdir($pwd);
     
     
    system (clear);
    #info puis première question à l'utilisateur
    print "         __________________________________________________\n\n";
    print "                    versCarthagene_mod\n";
    print "         __________________________________________________\n\n\n";
    print "Formatez bien votre fichier excel avant\nde le passer en fichier texte pour le programme,\nPas de cellules fusionnées !\nEt surtout PAS de tabulation dans les noms de marqueurs\n";
    print "\nEntrez le nom du repertoire contenant le(s) fichier(s) à formater :\n" ;
    chomp(my $repertoire=<STDIN>) ;
     
    #deuxieme question
    system (clear);
    print "\nNom de votre répertoire qui va contenir le(s) fichier(s) resultat(s) :\n" ;
    chomp (my $nomRep = <STDIN>) ;
    mkdir "$nomRep", 0777 or warn "Impossible de créer le répertoire : $nomRep (si il existe déjà il n'y auras pas de problèmes)\n" ;
     
    #boucle pour déterminer si le fichier nécéssite une transposition [question 3]
    while (!$okey)
    {
      print "\nComment est(sont) constitué(s) votre(vos) fichier(s) ?\nAvec les noms des marqueurs en haut de colones ?\nOu bien avec les noms de marqueurs en débuts de lignes ? :\n\nattention TOUT vos fichiers serons traités de la même manière\n\n\nLigne ? Colone ?\n" ;
      chomp ($choix = <STDIN>) ;
      if ($choix=~/^c/i)
      {
        $transpo=1;
        $okey=1;
      }
      elsif ($choix=~/^l/i)
      {
        $transpo=0;
        $okey=1;
      }
      else
      {
        print "\réponse incorecte\n";
      }
    }
     
    #boucle pour déterminer si un ou plusieurs fichier de sorties serons générez [question 4]
    system (clear);
    $okey=0;
    while (!$okey)
    {
      print "\nSi vous avez plusieurs fichiers d'entrées, souhaitez vous qu'il soient compilés en un seul fichier pour carthagene ? :\nOui ? Non ?\n" ;
      chomp ($choix = <STDIN>) ;
      if ($choix=~/^o/i)
      {
        $unique=1;
        $okey=1;
        print "\nLe fichier de résultat s'appellera Resultats_Compilees_Carthagen.cg\nappuyez sur entrer pour continuer";
        $valider = <STDIN> ;
      }
      elsif ($choix=~/^n/i)
      {
        $unique=0;
        $okey=1;
      }
      else
      {
        print "\réponse incorecte\n";
      }
    }
     
    #boucle pour personaliser la ligne d'entete des fiches de sortie (data type ....) [question 5]
    system (clear);
    $okey=0;
    while (!$okey)
    {
      print "\nVoulez-vous personnaliser la fin de la première ligne des fichiers générés ?\nPar defaut cette ligne est \"data type f2 backcross\"\nOui ? Non ?\n";
      chomp ($choix = <STDIN>) ;
      if ($choix=~/^o/i)
      {
        $okey=1;
        print "\nEntrez la fin de la ligne (correspondant à \"f2 backcross\" dans l'exemple ci-dessu)\n";
        chomp ($finData = <STDIN>) ;
        print "\n donc la première ligne de votre(vos) fichier(s) seras : \n\ndata type $finData\n\nappuyez sur entrer pour continuer";
        $valider = <STDIN> ;
      }
      elsif ($choix=~/^n/i)
      {
        $okey=1;
      }
      else
      {
        print "\réponse incorrecte\n";
      }
    }
     
    #boucle pour personaliser la 2iem ligne d'entete des fiches de sortie (avec les alias carthagene) [question 6]
    system (clear);
    $okey=0;
    while (!$okey)
    {
      print "\nVoulez vous personnaliser la fin de la deuxième ligne des fichiers générés ?\nPar defaut cette ligne est \"<nombre d'individus> <nombre de marquers> 0 0 1=H 0=A\"\nOui ? Non ?\n";
      chomp ($choix = <STDIN>) ;
      if ($choix=~/^o/i)
      {
        $okey=1;
        print "\nEntrez la fin de la ligne (correspondant aux alias de carthagene c'est à dire à \"1=H 0=A\" dans l'exemple ci-dessu)\n";
        chomp ($aliasC = <STDIN>) ;
        print "\n donc la deuxième ligne de votre(vos) fichier(s) seras : \n\nX Y 0 0 $aliasC\nX sera un chiffre représentant le nombre d'individu et Y le nombre de marqueurs\nappuyez sur entrer pour continuer";
        $valider = <STDIN> ;
      }
      elsif ($choix=~/^n/i)
      {
        $okey=1;
      }
      else
      {
        print "\réponse incorrecte\n";
      }
    }
    system (clear);
    #----------------                                                                                      ----------------
    #                                                   ----------------
    #                               ---------------- traitement des fichier ----------------
    #                                                   ----------------
    #                 ----------------                                                    ----------------
     
    #ouverture  du répertoire ou se trouvent les fichiers à traiter
    opendir (my $DIR, $repertoire) or die "Impossible d'ouvrir le repertoire contant le fichier à traiter ($repertoire)\nFin de programme\n" ;
    print "début du traitement\n";
    #initialisation des variables pour le traitement de fichier
    my @nom = () ;
    my @donnees = () ;
    my @bad =() ;
    my $lineTitre = 1 ;
    my $file;
    my @TDeT = () ;
    my $comptLigne = -1 ; #car on commence par la ligne titre qui est la ligne -1
    my $comptChar = 0 ;
    #pour chaque fichier dans le repertoire on effectue le traitement suivant
    foreach $file (readdir $DIR) 
    {
    #si le "fichier" est . ou .. on passe au suivant
    #(car se ne sont pas de véritables fichier mais en fait les addresses des dossier ou l'on se trouve et du dossier supérieur)
    	next if $file eq "." or $file eq ".." ;
    #ouverture du fichier courant
    	open(my $FILE,"$repertoire/$file") || die "Impossible d'ouvrir le fichier : $repertoire\/$file\n" ;
    	while(<$FILE>)
    #pour chaque ligne on effectue le traitement suivant
    	{
    #si le fichier est déjà à l'horizontal [lignes]
        if (!$transpo)
        {
    #on mémorise le nom de chaque marqueur
      		if(/\t/)
      		{
    #on le stock dans une liste (@nom)
      			push(@nom,$`) ;
      			my $tmp = $'; #variable qui nous permet de stocker la fin de ligne et de la modifier.
    #et on mémorises les information relative au marqueur dans une seconde liste (@donnees)
            if ($tmp=~ s/\t//g)
      		  {
              push(@donnees, $tmp) ;
              chomp($donnees[-1]);
            }
      		}
        }
    #si non c'est que le fichier est à la verticale [Colonnes]
        else
        {
    #on est sur une nouvelle ligne on réinitialise donc la valeur du compteur de caractères
          $comptChar = 0 ;
    #si on est sur la ligne titre
      		if($lineTitre)
      		{
    #on mémorise le nom de chaque marqueur dans une liste (@nom)
      		  while (/\t/)
      		  {
              push(@nom,$`) ;
              $_ = $';
            }
    #pour récupérer la derniere colonne (ici le dernier nom)
          $hard_chomp = $_ ;
          chomp($hard_chomp) ;
          push(@nom,$hard_chomp) ;#on chomp pour ne pas prendre le retoure à la ligne de la fin
          $lineTitre = 0 ; #on signale que la ligne titre à été traiter
          }
    #si on est pas au niveau de la ligne titre
          else
          {
            while (/\t/)
      		  {
    #on stock dans un tableau de tableau (@TDeT) chaque caractère avec comme premier indice
    #celui qui correspont à l'indice du nom sous lequelle il se trouve
    #et second indice correspondant à la ligne
              $TDeT[$comptChar][$comptLigne]=$` ;
              $_ = $'; # on enleve le carctère que l'on vien d'inserer dans le tableau de la variable $_
              $comptChar ++ ;
            }
    #pour récupérer la derniere colone (ici le dernier chiffre)
          $hard_chomp = $_ ;
          chomp($hard_chomp) ;
          $TDeT[$comptChar][$comptLigne]=$hard_chomp ; #on chomp pour ne pas prendre le retoure à la ligne de la fin
          }
          $comptLigne ++ ; # ici on signale qu'on à finit de traiter la ligne en cours
        }
    	}
    #on ferme le fichier une fois que on as finit de le traiter
      close($FILE);
      #si on as un fichier d'entrer en colonne alors on concatène le résultat 
      #du tableau de tableau dans le tableau de donnees
      if ($transpo)
      {
        my @Nvlldon = map ( {join("",@{$_} ) ; } @TDeT ) ;
        @donnees = (@donnees,@Nvlldon) ;
      }
    #si on veut plusieurs fichiers de sorties alors
    	if (!$unique)
    	{
    #on suprime le .txt du nom du fichier d'origine
        $file =~ s/\.txt// ;
    #et on lance la sous routine sortie
    		sortie($file,@donnees);
    #réinitialisation des variables pour que le prochain fichier à traiter n'ai pas les données du précédent
      	@nom = () ;
      	@donnees = () ;
      	@TDeT = () ;
      	$comptLigne = 0 ;
        $comptChar = 0 ;
    	}
    }
    closedir ($DIR) ;
    #on ferme le repertoire des fichier à traiter
     
    #si on veut un seul fichier de sortie alors on le genèrer en dehor de la boucle
    if ($unique)
    {
    #et on execute la sous routine sortie avec en paramatre le nom 
    #du fichier de résultats compilés et le tableau de données
      sortie("Resultats_Compilees_Carthagen",@donnees);
    }
    #message de fin du programme
    print "\nFormatage terminé\n";
     
     
    #----------------                                                                                      ----------------
    #                                                   ----------------
    #                            ----------------        Sous routines          ----------------
    #                                                   ----------------
    #                 ----------------                                                    ----------------
    #
     
    #écriture de fichiers
    sub sortie
    {
      #on récupere le nom du fichier de sortie
      my ($file,@donnees) = @_ ;
      #initialisation de la variable du nb de marqueurs
    	my $nbMarqueurs = @nom ;
      my $nbIndividus = length($donnees[0]) ;
    	#ouverture du fichier de sortie
    	open(my $OUT,">>$nomRep/$file.cg") || die "Impossible de trouver ou creer le fichier $nomRep\/$file.cg\n" ;
    	#écriture des 2 lignes d'entête.
    	print $OUT "data type $finData\n" ;
    	print $OUT "$nbIndividus $nbMarqueurs 0 0 $aliasC\n" ;
    	#boucle qui va écrire le fichier de sortie
    	my $i = 0 ;
    	while($i<=$#nom)
    	{
    		print $OUT "$nom[$i]\t" ;
        print $OUT "$donnees[$i]\n" ;
    		$i ++ ;
    	}
    	close($OUT);
    }
    je suppose que le chomp "oublier" est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      			my $tmp = $'; #variable qui nous permet de stocker la fin de ligne et de la modifier.
    #et on mémorises les information relative au marqueur dans une seconde liste (@donnees)
            if ($tmp=~ s/\t//g)
      	{
              push(@donnees, $tmp) ;
              chomp($donnees[-1]);
            }
    mais la aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #pour récupérer la derniere colonne (ici le dernier nom)
          $hard_chomp = $_ ;
          chomp($hard_chomp) ;
          push(@nom,$hard_chomp) ;#on chomp pour ne pas prendre le retoure à la ligne de la fin
    il faut savoir que le fichier d'entrer que je traite est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Omy1236INRA	Omy1236INRA	OMM1009	OMM1009	Omy1169INRA	Omy1169INRA	Omy1435INRA	Omy1435INRA	OmyUW1198	OmyUW1198	OMM5205	OMM5205	Oki26**	Oki26**	OMM1075	OMM1075
    -	-	1	-	-	-	-	-	-	-	0	-	-	-	-	-
    -	-	0	-	-	-	-	-	-	-	1	-	-	-	-	-
    -	-	1	-	0	1	-	-	-	-	1	-	-	-	-	-
    -	-	1	-	-	-	-	-	-	-	1	-	-	-	-	-
    etc.
    que mon fichier de sortie ressemble à ça chez moi :
    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
    data type f2 backcross
    1010 16 0 0 1=H 0=A
    Omy1236INRA	----
    Omy1236INRA	----
    OMM1009	1011
    OMM1009	----
    Omy1169INRA	--0-
    Omy1169INRA	--1-
    Omy1435INRA	----
    Omy1435INRA	----
    OmyUW1198	----
    OmyUW1198	----
    OMM5205	0111
    OMM5205	----
    Oki26**	----
    Oki26**	----
    OMM1075	----
    OMM1075	----
    et chez les autres ça ressemble à ça :
    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
    data type f2 backcross
    1010 16 0 0 1=H 0=A
    Omy1236INRA	----
    Omy1236INRA	----
    OMM1009	1011
    OMM1009	----
    Omy1169INRA	--0-
    Omy1169INRA	--1-
    Omy1435INRA	----
    Omy1435INRA	----
    OmyUW1198	----
    OmyUW1198	----
    OMM5205	0111
    OMM5205	----
    Oki26**	----
    Oki26**	----
    OMM1075	----
    OMM1075
    	-
    -
    -
    -
    (la différence est sur la derniere ligne du fichier de sortie)

    donc voila je ne sais pas quoi faire
    (et désoler de pas réussir à etre clair !)

    Par contre merci d'etre aussi réactif

    [EDIT] les sessions dont je parlais sont des sessions sur un serveur unix

  4. #4
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut et aussi
    Si tu as des suggestion sur mon code (comment l' amélioré le rendre plus efficace ou quoi) je suis tout à fait preneur

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    après cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(<$FILE>)
    #pour chaque ligne on effectue le traitement suivant
    	{
    rajoute ceci
    peut être que ça suffira

  6. #6
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut d'accord mais
    okey je vais fair ça mais une question : on as le droit de chomper $_ quand $_ est une ligne d'un fichier en lecture seul ?
    il me semblait que lorsque je le faisait perl me retournait un erreur du genre tentative pour modifier une variable impossible à modifier (me souviens pas exactement de l'erreur)

    car si je me trompe pas chomp sans paramètre essaye de chomper sur $_ non ?

    en tout cas je vais essayer merci

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 605
    Par défaut
    Hello,

    tu dois confondre avec les variables $1, $2 etc utilisées pour mémoriser des chaines de caractères lors de recherches via expression régulière. Ce genre de variables est effectivement en lecture seule et non modifiable.

    chomp sans argument va tenter de virer le "\n" de la variable $_ en effet

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

Discussions similaires

  1. Erreur gets.chomp : EISDIR
    Par Jeoffrey54 dans le forum Ruby
    Réponses: 7
    Dernier message: 11/03/2011, 02h12
  2. problème bizarre avec chomp
    Par skadum dans le forum Langage
    Réponses: 2
    Dernier message: 14/01/2011, 09h16
  3. Chomp en PHP
    Par Zuthos dans le forum Langage
    Réponses: 4
    Dernier message: 13/05/2009, 17h03
  4. chomp ou chop
    Par Ganondorf dans le forum Langage
    Réponses: 7
    Dernier message: 20/10/2007, 14h28
  5. afficher les chomp d'une table
    Par zidenne dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/10/2005, 10h10

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