Perl

De UnixManiax
Aller à la navigation Aller à la recherche


Tutoriels

Pour les bases, cette série de trois tutoriels de David Bourgais est très bien faite :


Tableau

Afficher toutes les lignes d'un tableau :

foreach $ligne (@tableau) {
  print "$ligne\n";
}

Tableau associatif

C'est un type de tableau où on associe deux valeurs. On le déclare avec un "%" devant. Pour appeler/modifier une valeur, c'est "$tableau{valeur}".

Pour afficher toutes les valeurs du tableau, on utilise une boucle while.

Ci-dessous un exemple qui va rendre les choses plus claires.

#!/usr/bin/perl
use strict;

my %motos = ("kawasaki" => "vert", "suzuki" => "bleu", "aprilia" => "rouge");

my $moto;
my $couleur;

print "Couleurs disponibles :\n";

while (($moto,$couleur) = each(%motos)) {
    print "- $moto : $couleur\n";
}

print "Nouvelles couleurs disponibles :\n";

$motos{"aprilia"} = "noir";

while (($moto,$couleur) = each(%motos)) {
    print "- $moto : $couleur\n";
}

Résultat :

$ ./test.pl 
Couleurs disponibles :
- kawasaki : vert
- suzuki : bleu
- aprilia : rouge
Nouvelles couleurs disponibles :
- kawasaki : vert
- suzuki : bleu
- aprilia : noir

Pour supprimer une valeur : "delete $tableau{valeur}".

On reprend l'exemple précédent dans lequel on rajoute un "delete". Au passage on créé une fonction pour l'affichage.

#!/usr/bin/perl
use strict;

my %motos = ("kawasaki" => "vert", "suzuki" => "bleu", "aprilia" => "rouge");

print "Couleurs disponibles :\n";
affiche();

$motos{"aprilia"} = "noir";
print "Nouvelles couleurs disponibles :\n";
affiche();

delete $motos{"aprilia"};
print "Modèles restants :\n";
affiche();

sub affiche {
    my $moto;
    my $couleur;
    while (($moto,$couleur) = each(%motos)) {
        print "- $moto : $couleur\n";
    }
}

Résultat :

$ ./test.pl 
Couleurs disponibles :
- kawasaki : vert
- suzuki : bleu
- aprilia : rouge
Nouvelles couleurs disponibles :
- kawasaki : vert
- suzuki : bleu
- aprilia : noir
Modèles restants :
- kawasaki : vert
- suzuki : bleu


Parser une chaîne de caractères

Perl est très puissant pour parser une chaîne de caractères. Il permet de rechercher des motifs et de les mettre dans des variables au fur et à mesure.

Dans l'exemple qui suit, on recherche un nombre indéfini de caractères alphanumériques, suivit de ":", puis de 4 chiffres et enfin d'un nombre indéfini de chiffres. Chaque motif qu'on souhaite mettre dans une variable sera entouré de parenthèses. Pour avoir le motif global, on met des parenthèses autour de l'ensemble. Les motifs sont sauvegardés dans les variables $1, $2 et ainsi de suite. Les numéros sont attribués au fur et à mesure qu'on ouvre les parenthèses.

#!/usr/bin/perl
use strict;

my $chaine="abCD12ef:123456";
if ( $chaine =~ /((\w+):(\d{4})(\d+))/ ) {
    my($val1, $val2, $val3, $val4) = ($1, $2, $3, $4);
    print "motif global : $val1\n";
    print "motif 1 : $val2\n";
    print "motif 2 : $val3\n";
    print "motif 3 : $val4\n";
}

Résultat :

$ ./test.pl 
motif global : abCD12ef:123456
motif 1 : abCD12ef
motif 2 : 1234
motif 3 : 56

On voit que c'est l'opérateur "=~" qui est utilisé pour la comparaison entre la chaîne et les motifs.

La recherche se fait entre les caractères "/" et "/". Si on veut rechercher un "/" dans les motifs , il faut le faire précéder d'un "\".

S'il y a plus de 9 motifs, on continue sans problème à $10, $11 etc.