Exo trouvé sur net à l'adresse : http://www.esil.univ-mrs.fr/~dgaut/Cours/sommaire-unixperl.html \paragraph*{Exercice 2} Attention à l'opérateur \verb+=~+ \ldots \begin{enumerate} \item Réalisez un script Perl lisant un fichier de séquences au format Fasta et comptant les occurences d'une expression régulière dans les séquences lues.\\ {\em Indices.} \begin{itemize} \item Les séquences sont stockées dans une chaine de caractères. \item Utilisez l'opérateur \verb+=~+ avec l'option {\tt g} (pour global). \item L'expression régulière et le nom du fichier Fasta sont spécifiés à l'intérieur du script. \end{itemize} \item L'opérateur \verb+=~+ a pour inconvénient de ne pas compter les occurences chevauchantes d'un motif (par exemple, le motif {\tt AGA} intervient deux fois dans {\tt AGAGA} mais n'est vu qu'une fois). A l'aide d'une boucle {\tt for} avançant pas à pas sur la séquence, modifiez le script précédent pour compter TOUTES les instances d'un motif. Appliquez ce programme au comptage d'hexamères dans "petiteseq.fasta". \end{enumerate} ############# # exo2.1.pl # ############# #!/usr/bin/perl -w # Programme comptant les occurences d'une expression reguliere # dans un fichier de sequences au format Fasta # Le programme utilise l'operateur =~ # Il ne peut donc rechercher les expressions chevauchantes open(F, "p53_seq.txt"); $regexp = "A."; #mettre ce qu'on veut #lecture de l'ensemble des sequences $line = ; while ($line) { #si la ligne commence par ">", on est au debut d'une sequence if ($line =~ /^>/) { $name = $line; $seq = ""; #reinitialise la variable stockant la sequence #tant que l'on n'arrive pas a la sequence suivante: lire while (($line = ) && ($line !~ /^>/)) { chomp $line; $line =~ tr/\s//d; # enleve les blancs $seq .= $line; #pareil que: $seq = $seq . $line } #stocke dans @hits toutes les occurences de l'expression @hits = ($seq =~ /$regexp/gi ); #pour chaque occurence: remplit le tableau associatif des resultats foreach $h (@hits) { $occur{$h}++ ; } } else { $line = ; } } close F; #affichage des resultats while( ( $key , $count ) = each %occur ){ print "$key: $count\n"; } ############# # exo2.2.pl # ############# #!/usr/bin/perl -w # Programme comptant les occurences d'une expression reguliere # dans un fichier de sequences au format Fasta # Le programme verifie la presence de l'expression a chaque # position de la sequence. # Il peut donc trouver toutes les occurences d'une expression # mais il est bcp plus lent que celui utilisant les exp. reg. open(F, "p53_seq.txt"); $regexp = "A."; #mettre ce qu'on veut #lecture de l'ensemble des sequences $line = ; while ($line) { #si la ligne commence par ">", on est au debut d'une sequence if ($line =~ /^>/) { $name = $line; $seq = ""; #reinitialise la variable stockant la sequence #tant que l'on n'arrive pas a la sequence suivante: lire while (($line = ) && ($line !~ /^>/)) { chomp $line; $line =~ tr/\s//d; # enleve les blancs $seq .= $line; #pareil que: $seq = $seq . $line } $lseq = length( $seq ) ; #on avance d'1 position a la fois sur la sequence for ( $i = 0 ; $i < $lseq ; $i++){ #on ne regarde que le morceau de sequence qui commence a $i $partseq = substr( $seq , $i ) ; #si $partseq commence par $regexp, alors on a un hit if($partseq =~ /^$regexp/o ){ $occur{$&}++ ; # $& est la chaine matchee par le =~ } } } else { $line = ; } } close F; #affichage des resultats while( ( $key , $count ) = each %occur ){ print "$key: $count\n"; }