[PERL] question facile <STDIN>

question facile <STDIN> [PERL] - Perl - Programmation

Marsh Posté le 07-03-2005 à 13:16:01    

il s'agit d'un code lisant un fichier au format FASTA, pour ceux qui connaissent, mais ca n'a pas trop d'importance : voici l'entrée :  
 
>chr1_1113 100080001 to 100180000
CACTAGATTTGTTTTTGTGTATCAGCAGATTATTTTATGTCACAGACATGAATAGTCAAA
ACTACTGATGTTAAATATTTGTATGCTCGTCTGTATTATTTGGTATATAGGAGCTGCTTC
TTCCCTGGCCTCACCCCAATTCCTATTTCTCACTTCAAAGGAAAGTATATATTTTCACAT
TACTTCAGTTGTCGGATTTGGGGGAAAATAAGAAAAATGTAATTTCTAACAGAGGTAACA
CCCATTATGTCTCAAACAGGATCAGCCATTGTTTGAAGTCATACAGGAAGCAATGCAAAA
...
 
voici ma commande :  
 
cat chr1.test.fa | perl -w  splitSeqIdris.pl
 
ou chr1 est le fichier en entree dont je fournis un extrait ci dessus, et splitSeqIdris.pl le nom du script ci dessous
 
voici ce que m'affiche la console :  
 
[glorieux@lin2 ~]$ cat chr1.test.fa | perl -w  splitSeqIdris.pl
ligne stdin : >chr1_1113 100080001 to 100180000
ligne : CACTAGATTTGTTTTTGTGTATCAGCAGATTATTTTATGTCACAGACATGAATAGTCAAA
Use of uninitialized value in subroutine entry at splitSeqIdris.pl line 26, <STDIN> line 2.
Can't use string ("" ) as a subroutine ref while "strict refs" in use at splitSeqIdris.pl line 26, <STDIN> line 2.
 
 
je ne comprends pas pourquoi $ligneEntree est vide et qd je l'affiche elle n'est pas vide?
 
 
voici mon code :

Code :
  1. #!perl -w
  2. use strict;
  3. my $ligneEntree ;
  4. while ($ligneEntree = <STDIN> ) {
  5. print("ligne stdin : ".$ligneEntree);
  6. my $tailleMorceau = 1000;
  7. my $overlap = 100;
  8. my $compteur ;
  9. # verifier si la taille de morceau et l'overlap sont divisibles par 50
  10. if (($tailleMorceau % 50) != 0 || ($overlap % 50) != 0) {
  11.  die("la taille de morceau ou l'overlap ne sont pas des mutliples de 50 " );
  12. }
  13. # si il s'agit d'un ligne de titre
  14. if (substr($ligneEntree,0,1)eq">" ) {
  15.  $compteur = gerer($ligneEntree, $tailleMorceau, $overlap) ;
  16. # sinon c'est une ligne de corps
  17. } else {
  18.  print("ligne : ".$ligneEntree);
  19.  &$compteur($ligneEntree);
  20. }
  21. sub gerer {
  22.  my $titre = shift ;
  23.  my $tailleMorceau = shift ;
  24.  my $overlap = shift ;
  25.  # donne le nombre de ligne du morceau
  26.  my $indexLigne = 0;
  27.  # donne le nombre de caracteres dans la sequence avant fractionnement
  28.  my $indexSequence = 0 ;
  29.  my @tableauOverlap ;
  30.  # donne la ligne a laquelle on est dans le tableau d'overlap
  31.  my $indexOverlap = 0 ;
  32.  # donne la taille maximale du tableau d'overlap
  33.  my $indexOverlapMax = $overlap / 50 ;
  34.  # afficher le titre pour la première fois
  35.  print(">0-$tailleMorceau".substr($titre,1));
  36.  return sub {
  37.   my $ligne = shift ;
  38.   print("ligne interne : ".$ligne);
  39.   # mettre la ligne lue dans le tableau d'overlap
  40.   $tableauOverlap[$indexOverlap] = $ligne ;
  41.   $indexOverlap++ ;
  42.   # si on atteint le bout du tableau circulaire on revient a debut du tableau
  43.   if ($indexOverlap == $indexOverlapMax) {
  44.    $indexOverlap = 0 ;
  45.   }
  46.   $indexLigne++ ;
  47.   # si on a atteint la taille du morceau
  48.   if ($indexLigne*50 == $tailleMorceau) {
  49.    #afficher le nouveau titre
  50.    print(">$indexSequence-($indexSequence+$tailleMorceau)".substr ($titre,1));
  51.    #afficher le tableau d'overlap (pas encore fonctionnel)
  52.    foreach my $i (@tableauOverlap)
  53.    {
  54.        print "$i\n";
  55.    }
  56.    $indexSequence += $tailleMorceau ;
  57.   }
  58.  }
  59. }
  60. }

Reply

Marsh Posté le 07-03-2005 à 13:16:01   

Reply

Marsh Posté le 07-03-2005 à 13:26:34    

C'est parce que tu redéfinis $compteur à chaque while !!!
Sors le my $compteur de la boucle !
( et tant qu'à faire, sors-en le sub gerer aussi !!! )
 
Jamais le message d'erreur ne t'a dit que $ligneEntree était vide ...  
 
"Can't use string ("" ) as a subroutine"


Message édité par Mr Mala le 07-03-2005 à 13:34:14
Reply

Marsh Posté le 07-03-2005 à 14:34:09    

très juste merci on se demande comment je fonctionne... :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed