InfoBio TD bioperl
From silico.biotoul.fr
L'objet du TD est de se familiariser avec le langage Perl et le module BioPerl.
Perl (pour Pratictal Extraction and Reporting Language) est un langage de programmation/script. Il met en oeuvre le paradigme de la programmation itérative.
Contents |
Types de données
- nombre entier
- nombre réels
- chaîne de caractères. Comme dans un script shell, dans une chaîne délimitée par des simples quote ' , les variables ne sont pas remplacées par leur valeur contrairement aux chaînes délimitées par des double quote ".
- descripteur de fichier
- référence (pointeur)
Structures de données
- les scalaires (SCALAR) utilisant la notation $. Par exemple $filename = 'sequences.fasta' contiendra typiquement le nom (ou chemin) d'un fichier.
- les listes ou tableaux (ARRAY) utilisant la notation @. Par exemple @filenames = ['comE_sequences.fasta', 'comD_sequences.fasta']. Pour accéder à un élément, on utilise un indice : $filenames[3] pour le quatrième élément.
- les tableaux associatifs (HASH) avec la notation %. Par exemple %gene_annotations = { 'comD'=>'sensor', 'comE'=>'response regulator' } ou bien %gene_annotations = [ 'comD', 'sensor', 'comE', 'response regulator']. Pour accéder à un élément : $gene_annotation{'comD'}.
Pour plus de détails, cf. http://perldoc.perl.org/perldata.html
Quelques fonctions essentielles
L'ensemble des fonctions disponibles : http://perldoc.perl.org/perlfunc.html#Perl-Functions-by-Category
Opérations sur les listes
Les listes peuvent se manipuler comme des piles (LIFO), files (FIFO) ou autres grâce aux opérations :
- $elem = pop @list; récupère (et supprime de la liste) le dernière élément
- push @list, $elem; opération duale de pop : ajoute l'élément en fin de liste
- $elem = shift @list; récupère (et supprime) le premier élément de la liste
- unshift @list, $elem dévinez !
- $nb_elem = scalar @list; interprète la liste dans un contexte scalaire ce qui correspond à récupérer le nombre d'éléments.
- sort @list trie la liste par ordre lexicographique. Si l'on veut trier par ordre numérique croissant (11>2 alors que "11"<"2") il faut spécifier la routine de tri : sort {$a <=> $b} @list.
- itérations sur chaque éléments: foreach my $elm (@list) { print $elm; }
Opérations sur les tableaux associatifs
- @list = keys %hash;
- les clés triées : @list = sort keys %hash;
- les clés triées en fonction des valeurs en ordre numérique décroissant : @list = sort { $hash{$b} <=> $hash{$a} } keys %hash;
cf. http://perldoc.perl.org/functions/sort.html pour plus d'exemples de tri.
- les valeurs : @list = values %hash;
- itérations sur chaque élément : foreach my $key (keys %hash) { print $hash{$key}: }
Quelques particularités
Certaines variables sont prédéfinies :
- $_ et @_ correspondent à la variable par défaut ou variable courante.
Exemple :
foreach my $elem (@list) { print $_; }
- <> correspond au fichier passé en paramètre au script.
Exemple : lacement du script suivant avec la commande: sh> perl le_script.pl un_fichier_texte.txt
#!/usr/bin/perl while (<>) { chomp; print $. . $_; }
Commentaires : la boucle while itère sur chaque ligne du fichier. La fonction chomp supprime le caractère de fin de ligne (ici, le fait de l'appeler sans paramètre l'applique à la variable par défaut $_ qui est une ligne du fichier texte). La variable spéciale $. correspond au numéro de ligne du fichier. Le '.' qui suit correspond à la concaténation de chaînes de caractères.
Manipulation de fichiers
- Lecture d'un fichier
open(F, '<filename'); while (<F>) { ... } close(F);
- Ecriture dans un fichier
open(F,'>output_file'); print F 'some content'; close(F);
Branchements conditionnels
if ($condition) { ... } # avec un else if (open(F,"$filename")) { ... } else { ... } # avec un else if if ($condition) { ... } elsif ($autre_condition} { ... } # le if en fin de statement print $some_debuging if $verbose; # l'inverse : le ''à moins que'' (unless) print "Success" unless $failure;
Boucles
# WHILE my $i=0; while ($i<$max_iteration && $do_not_stop) { ... $i++; } # FOR for (my $i=0 ; $i < scalar @list ; $i++) { $list[$i] *= 2; }