Initiation au Langage Perl


Suivant Précédent

  • Séance 6

  • Objectif
  • Manipulations de textes balisés

    Extraire les balises, extraire le texte

  • Programme en Perl
  • But de la séance

  • Exemple 1: Comptage de balise
  • On souhaite connaître le nombre de balise d'un certain type présentes dans le fichier de travail. Pour chaque ligne, nous allons compter le nombre d'occurrences de la balise <balise>. Pour cela, on parcourt tout le fichier de données ligne par ligne et pour chaque ligne on regarde si elle commence par la balise <balise>. Si c'est le cas, alors on incrémente un compteur.

    #!/usr/local/bin/perl

    while(<STDIN>)

    {

    if (/^<balise>/)

    {

    $nb++;

    }

    }

    print "Il y a $nb références\n";

    Le programme est constitué d'une boucle while qui permet de parcourir tout le fichier de données.

    L'expression if (/^<balise/) est un test, elle retourne vrai si la chaîne de caractères lue est couverte par l'expression régulière placée entre les barres obliques (slash). Le programme se lit donc de la manière suivante: pour chaque ligne du fichier d'entrée standard, si cette ligne commence par la suite de caractères <balise>, alors on incrémente une variable ($nb) dont la valeur est affichée en fin de traitement.

  • Exemple 2: Extraction de texte balisé
  • On cherche à extraire le texte placé entre deux balises. Le nom de la balise sera indiqué en argument de la commande. Nous allons utiliser une expression régulière pour extraire, sur chaque ligne, le texte placé entre les suites de caractères <balise> et </balise>.

    #!/usr/local/bin/perl

    $rech=$ARGV[0];

    while (<STDIN>)

    {

    if (/<$rech>(.+)<\/$rech>/)

    {

    print "$1\n";

    }

    }

    La structure de ce programme est identique à celle du précédent, c'est-à-dire que l'on parcourt un fichier en effectuant un test sur chaque ligne. On utilise la variable $ARGV[O] qui est une variable prédefinie. ARGV est en fait un tableau de variables qui contient l'ensemble des arguments passés en ligne de commande. Ainsi $ARGV[O] fait référence au premier argument.On utilise aussi des variables Perl à l'intérieur d'une expression régulière :

    if (/<$rech>(.+)<\/$rech>/)

    Dans un tel cas I'interpréteur remplace la variable par sa valeur (en considérant que c'est une chaine de caractères). La variable $1 utilisée dans print fait référence au motif reconnu par l'expression régulière entre parenthèses. La variable $_ est une variable prédéfinie: la variable par défaut. Lorsque, pour certaines commandes ou opérateurs (par exemple while), aucune variable n'est précisée bien que ce soit nécessaire, alors c'est cette variable qui est utilisée (d'où son nom).

  • Exemple 3: Liste des balises
  • On veut afficher la liste des balises utilisées dans le fichier de travail et les trier par ordre alphabétique. On parcourt le fichier ligne par ligne. Pour chaque ligne: on élimine le texte placé entre les balises; pour chaque nouvelle balise on crée un nouvel élément dans un tableau. Lorsque le fichier a été entièrement parcouru, le tableau contenant la liste des balises est trié, dans l'ordre alphabétique, puis affiché.

    Programme

    #!/usr/local/bin/perl

    while (<>){

    chop;

    s/>[^<]+</></g;

    s/></&/g;

    s/ [^&]+&/&/g;

    s/[\/<>\t]//g;

    @liste=split(/&/);

    foreach(@liste){

    $ind{$_}++;

    }

    }

    @res=sort keys %ind;

    print"\nliste des balises trié : \n@res\n";

    La condition du while (<>) permet de faire référence aux fichiers dont les noms sont donnés en argument. Comme pour l'entrée standard (<STDIN>), les lectures de fichiers se font ligne par ligne.

    La première partie de la boucle permet de nettoyer la ligne à l'aide de l'opérateur :

    $variable =~ s/expression régulière/motif/options

    Cet opérateur permet de modifier le contenu de la variable $variable en remplaçant les suites de caractères couvertes par l'expression régulière par motif. Cet opérateur utilise la variable par défaut. Le nettoyage se fait en quatre temps:

    1. Suppression du dernier caractère, en l'occurrence le caractère fin de ligne, à l'aide de la commande chop;

    2. Suppression du texte placé entre deux balises.

    3. Remplacement de la suite de caractères >< par le caractère %. Le caractère % devient un séparateur de balises (il reste cependant un < en début de ligne et un > en fin de ligne);

    4. Elimination des caractères indésirables.

    L'instruction @liste=split(/%/) découpe le contenu de la variable par défaut (puisqu'aucun nom de variable n'est indiqué) d'après la valeur d'une expression régulière (ici /%/) et range le contenu dans un tableau.