[Perl] fonction sysread

fonction sysread [Perl] - Perl - Programmation

Marsh Posté le 22-11-2004 à 12:29:38    

Bonjour,
je débute à la fois en python et en perl.
J'ai fait un script en python qui marche bien, et je veux faire le même en Perl.
 
Cependant je suis en train de butter sur la fonction Sysread de perl.
 
Ce script a pour but de recolter 50 caractères d'une chaine de caractères. Je vous expose ici que la fonction du programme:
 
Voila en python se que ma fonction donne:
 

Code :
  1. def collect():
  2.     #Cette fonction permet de récolter les nucleotides par paquet de 50
  3.     #pour chaque ligne
  4.     paq=fsource.read(50)
  5.     fnuc.write(paq)
  6.     fnuc.write("\n" )


 
fsource est donc la variable qui correspond à mon fichier ouvert.
fnuc est la variable qui écrit mes 50 caractères dans un nouveau fichier.
 
En perl j'en suis là:
 

Code :
  1. sub collect()
  2. {
  3.    $paq=sysread(fsource,$paq,length(50)));
  4.    syswrite(fnuc,$paq,length($paq));
  5.    syswrite(fnuc,$paq,length(2));
  6. }


 
En fait je ne sais pas quoi mettre après fsource? Certainement pas $paq  :??:  
 
Merci pour votre aide!

Reply

Marsh Posté le 22-11-2004 à 12:29:38   

Reply

Marsh Posté le 22-11-2004 à 12:46:49    

on peut voir le reste de ton code?

Reply

Marsh Posté le 22-11-2004 à 12:52:12    

python:

Code :
  1. #! /usr/bin/env python2
  2. import sys,time
  3. start = time.clock()
  4. n=0
  5. #------FONCTION COLLECT-------
  6. def collect():
  7.     #Cette fonction permet de rйcolter les nucleotides par paquet de 50
  8.     #pour chaque ligne
  9.     paq=fsource.read(50)
  10.     fnuc.write(paq)
  11.     fnuc.write("\n" )
  12. #-----------------------------
  13. #Calcul du nombre de ncl dans la sequence
  14. i=len(sys.argv[1])
  15. #Debut du programme:
  16. fsource=open(sys.argv[1],"r" )  #ouverture du fichier source fsource
  17. fnuc=open(sys.argv[2],"w" )  #creation et ouverture du fichier fasta
  18. while n<=i:
  19.     collect()
  20.     n+=1
  21. fnuc.close()
  22. fsource.close()
  23. end = time.clock()
  24. print "\n","Execution en",end-start,"sec \n"


 
Perl:
 

Code :
  1. $n=0
  2. open(fsource,"$ARGV[0]" );
  3. open(fnuc,">$ARGV[1]);
  4. $i=length(<fsource> );
  5. while ($n<=$i)
  6. {
  7.   &collect();
  8.   $n=$n+1;
  9. }
  10. close fsource;
  11. close fnuc;
  12. sub collect()
  13. {
  14.    $paq=sysread(fsource,$paq,length(50)));
  15.    syswrite(fnuc,$paq,length($paq));
  16.    syswrite(fnuc,$paq,length(2));
  17. }


Message édité par suomi le 22-11-2004 à 12:52:35
Reply

Marsh Posté le 22-11-2004 à 13:37:30    

moi je le ferais comme ca
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. open(FENT, '< ' $ARGV[0]);
  4. my @lines = <FENT>;
  5. close(FENT);
  6. my $paq = join("", @lines);
  7. $paq =~ s/\n//g;
  8. open(FSOR, '> ' $ARGV[1]);
  9. for (my $i = 1; $i * 50 < length($paq) + 50; $i++) {
  10.   if (($i * 50) - 1) <= length($paq)) {
  11.     print FSOR substr($paq, ($i - 1) * 50, ($i * 50) - 1) . "\n";
  12.   }
  13.   else {
  14.     print FSOR substr($paq, ($i - 1) * 50, length($paq) - 1) . "\n";
  15.   }
  16. }
  17. close(FSOR);


 
le code a pas été testé mais ca doit pas être loin de ca
javais pas le temps ce matin (7hrs36 ici)
je dois partir, ce soir je regarderai du coté de sysread, ca semble plutot bien comme truc effectivement

Reply

Marsh Posté le 22-11-2004 à 13:47:22    

sinon selon moi, ton sysread devrait être
 

Code :
  1. sysread(fsource, $paq, 50));


 
et non
 

Code :
  1. $paq=sysread(fsource,$paq,length(50)));


 
et tes syswrite remplacés par ca
 

Code :
  1. print fnuc $paq . "\n";

Reply

Marsh Posté le 22-11-2004 à 14:06:27    

Burgergold a écrit :

sinon selon moi, ton sysread devrait être
 

Code :
  1. sysread(fsource, $paq, 50));


[/cpp]


 
Merci pour tes reponses.
J'ai rentré ton code mais il ne marche pas...
 
J'avoue que si mon code peut marcher ça m'arrangerai.
Je pense que ma synthaxe n'etait pas bonne et que le tienne pour le sysread est ok.
Cependant, lorsque j'ajoute un print $paq, il ne m'affiche rien.
Il faut encore chercher....  :(

Reply

Marsh Posté le 22-11-2004 à 18:50:55    

syswrite et sysread renvoie le nombre d'octets lus ou ecrit
 
perldoc:
 
 
#############
## sysread ##
#############
    sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
    sysread FILEHANDLE,SCALAR,LENGTH
            Attempts to read LENGTH *characters* of data into variable
            SCALAR from the specified FILEHANDLE, using the system call
            read(2). It bypasses buffered IO, so mixing this with other
            kinds of reads, "print", "write", "seek", "tell", or "eof" can
            cause confusion because stdio usually buffers data. Returns the
            number of characters actually read, 0 at end of file, or undef
            if there was an error. SCALAR will be grown or shrunk so that
            the last byte actually read is the last byte of the scalar after
            the read.
 
            Note the *characters*: depending on the status of the
            filehandle, either (8-bit) bytes or characters are read. By
            default all filehandles operate on bytes, but for example if the
            filehandle has been opened with the ":utf8" I/O layer (see
            "open", and the "open" pragma, open), the I/O will operate on
            characters, not bytes.
 
            An OFFSET may be specified to place the read data at some place
            in the string other than the beginning. A negative OFFSET
            specifies placement at that many characters counting backwards
            from the end of the string. A positive OFFSET greater than the
            length of SCALAR results in the string being padded to the
            required size with "\0" bytes before the result of the read is
            appended.
 
            There is no syseof() function, which is ok, since eof() doesn't
            work very well on device files (like ttys) anyway. Use sysread()
            and check for a return value for 0 to decide whether you're
            done.
 
 
 
 
##############
## syswrite ##
##############
    syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
    syswrite FILEHANDLE,SCALAR,LENGTH
    syswrite FILEHANDLE,SCALAR
            Attempts to write LENGTH characters of data from variable SCALAR
            to the specified FILEHANDLE, using the system call write(2). If
            LENGTH is not specified, writes whole SCALAR. It bypasses
            buffered IO, so mixing this with reads (other than sysread()),
            "print", "write", "seek", "tell", or "eof" may cause confusion
            because stdio usually buffers data. Returns the number of
            characters actually written, or "undef" if there was an error.
            If the LENGTH is greater than the available data in the SCALAR
            after the OFFSET, only as much data as is available will be
            written.
 
            An OFFSET may be specified to write the data from some part of
            the string other than the beginning. A negative OFFSET specifies
            writing that many characters counting backwards from the end of
            the string. In the case the SCALAR is empty you can use OFFSET
            but only zero offset.
 
            Note the *characters*: depending on the status of the
            filehandle, either (8-bit) bytes or characters are written. By
            default all filehandles operate on bytes, but for example if the
            filehandle has been opened with the ":utf8" I/O layer (see
            "open", and the open pragma, open), the I/O will operate on
            characters, not bytes.

Reply

Marsh Posté le 25-11-2004 à 14:05:54    

:bounce:  
Un petit Up car marche toujours pas  :(  
Merci pospos pour ces détails, mais j'ai du mal à cerner SCALAR.
 
Dans ma fonction sub collect, lorsque je fais un print fsource, il ne m'affche rien. ça défile mais avec rien comme caractères.
Par contre lorsque je fais un print de fsource hors de la fonction ça marche....

Reply

Marsh Posté le 25-11-2004 à 14:21:35    

en perl tu as 3 type de conteneur par défaut
 
le scalar: une variable seule
l'array: un tableau de scalar
le hash: un array associatif (key->value) où key est un scalar et value aussi
 

Reply

Marsh Posté le 25-11-2004 à 14:42:26    

Bon j'avance mais à petit pas...
Merci pour votre participation. pas facile quand on débute  :)  
 
 

Code :
  1. #/usr/bin/perl
  2. $n=0;
  3. #calcul du nombre de nucleotide ds la sequence
  4. $i=length(<fsource> );
  5. print $i;
  6. print "\n";
  7. #programme
  8. open(fsource,"$ARGV[0]" ); #ouverture du fichier source fsource
  9. open (fnuc,">$ARGV[1]" ); #creation et ouverture du fichier fasta
  10. #print <fsource>;   #Test du print OK
  11. #Mise en place de la boucle qui va ecrire ds fnuc les 50 caractères
  12. while ($n<=$i)
  13. {
  14. &collect();
  15. $n=$n+50;
  16. print $n;
  17. }
  18. close fsource;
  19. close fnuc;
  20. ########  Fonction COLLECT ########
  21. sub collect
  22. {
  23. #print <fsource>;
  24. sysread(fsource,$paq,49);
  25. #print $paq;
  26. syswrite(fnuc,$paq,length($paq)); 
  27. syswrite(fnuc,"\n",length(2));
  28. }


 
Lorsque j'active le print dans la boucle de fsource, rien ne s'affiche.
Lorsque j'active le print de $paq par contre il m'affcihe les 50 premiers caractères.
Par contre:
Lorsque j'active le print dans le programme, il m'affiche tout fsource
 
En fonction de la position de $i, j'ai soit 0 ou la taille complète en nombre de caractère de mon fichier.
 
 
Resultat: je n'ai que les 50 premiers caractères de copié. La fonction n'est pas relancé...

Reply

Marsh Posté le 25-11-2004 à 14:42:26   

Reply

Marsh Posté le 25-11-2004 à 14:47:10    

ta fonction collect sert pas à grand chose, pk tu la place pas directement dans ton while?
 
et ajoute au début de ton script "use strict;"
ainsi que des "my" devant chaque déclaration de nouvelle variable

Reply

Sujets relatifs:

Leave a Replay

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