$
dénote une variable scalaire;
@
dénote une variable tableau;
my @tab
=
(3.5
,-5
); #
déclaration
et
initialisation
$t
[0
] =
-4
; #
affectation
d'un
élément
print
"
$
t
[
0
]
\n
"
; #
affichage
d'un
élément
unshift
prend en arguments un tableau et une liste de valeurs scalaires ; ces valeurs sont ajoutées au début du tableau : unshift
(@tab
,5
,6
); @tab
vaut alors la liste (5
,6
,3.5
,-5
). shift
prend un tableau en argument ; elle supprime son premier élément (les autres sont alors décalés) et renvoie cet élément : $e
=shift
(5
,6
,3.5
,-5
)$e
vaut alors 5
et @tab
la liste (6
,3.5
,-5
). push
prend en argument un tableau et une liste de valeurs scalaires ; ces valeurs sont ajoutées à la fin du tableau : push
(@tab
,1
,2
)@tab
vaut alors la liste (6
,3.5
,-5
,1
,2
). pop
prend un tableau en argument ; elle supprime son dernier élément et renvoie cet élément : $e
=pop
(@tab
)$e
vaut alors 2
et @tab
la liste (6
,3.5
,-5
,1
). %
dénote une variable de hashage;
my %ha
=
( key1
=
>
val1
,
key2
=
>
val2
);
split
prend en paramètres un séparateur et une chaîne de caractères ; elle renvoie la liste des éléments de la chaîne de caractères délimités par le séparateur.
=>
@tab
=split
(/:/,"
);1
:4
:-1
:5
"@tab
=(1
,4
,-1
,5
)
join
prend en paramètre un scalaire et une liste ; elle renvoie une chaîne de caractères comportant les éléments de la liste, concaténés et séparés par ce premier paramètre scalaire.
$e
=join
("|",@tab
);
=> $e
="1
|4
|-1
|5
"
sub
permet de définir des fonctions en Perl. Les arguments d'une fonction sont des valeurs scalaires et elles sont accessibles via le tableau @_
sub
FonctionTest
{
my ($a
,$b
,$c
) =
@_
;
... instructions ...
return $x
;
}
=> Appel: FonctionTest
(1
,4
,-1
);open
(HANDLE
,"Chemin/Nom de fichier
");=~
=>
Guide de programmation PERL; expressions régulières
CACM
qui contient les titres, auteurs et résumés (lorsque ces derniers sont disponibles) d'un ensemble d'articles scientifiques, ainsi qu'un ensemble de requêtes et de jugements de pertinence. L'ensemble des documents est disponible à l'adresse suivante:
6
fichiers, cacm.all
, cite.info
, common_words
, qrels.text
,
query.text
et README
. Ce dernier contient des informations sur les fichiers précédents.
La collection contient 3204
documents, dont le texte est disponible dans le fichier
cacm.all
. Dans ce fichier, chaque document est séparé par une balise .I
(suivie de
l'identificant du document) qui contient le titre du documents (balise .T
), les auteurs
(balise .A
), la date de publication (balise .B
), l'abstract (balise .W
), des mots-clefs (balise
.K
) ainsi que d'autres informations que nous ignorerons (en particulier des informations par rapport aux articles cités dans la balise .X
). Certaines informations (par exemple
abstract ou mots-clefs) peuvent ne pas être disponibles pour certains documents. le
fichier query.text
contient le texte des requêtes. Chaque requête est précédée d'une
balise .I
(suivi de l'identifiant de la requête), le texte de la requête est contenu dans
la balise .W
, la balise .N
donne l'auteur de la requête (à ignorer). Certaines requêtes
sont données avec une balise .A
qui représente des auteurs spécifiques pour les articles à
renvoyer. Le fichier qrels.text
contient les identifiants des documents pertinents pour
les requêtes. Chaque ligne donne un couple d'idientifiants (requête, document pertinent
pour la requête). Ce fichier sera utile pour l'évaluation qu'on verra plus tard. Enfin,
le fichier common_words
contient les mots fréquents de la collection, et nous servira de
stop-list. Le fichier cite.info
contient des informations relative au codage des citations
(balise .X
) dans le fichier cacm.all
. Ce fichier est ignoré dans la suite.
.I
, la fonction suivante extrait les contenu des balises .T
, .A
, .W
et .B
en les mettant dans un fichier portant le nom CACM-
XX
où XX
est le numéro associé à la balise .I
sub
ExtractionDesFichiers
($$
)
{
my
($FileName
,$Path
)=
@_
; # Tableau des paramètres
open
(F
,$FileName
) || die
"Erreur d'ouverture du fichier $FileName\n"
;
my
$str
=
""
;
my
$Num
=
0
;
open
(COL
,">$Path/Collection"
) || die
"Erreur de creation de Collection\n"
;
while
(!eof(F)
){
if
($str
=~
m
/\.I\s/
){
# On regarde si s$tr contient la chaîne .I
close
(NF
);
$str
=~
s/\.I\s//g
; # Dans $str, on supprime la chaîne .I avant le numéro de document
$Num
=
$str
;
print
COL
"CACM-$Num\n";
print
"Processing ... CACM-$Num\n";
open
(NF
,">$Path/CACM-$Num"
);
}
if
(($str
=~
m/\.T/
) || ($str
=~
m/\.A/
) || ($str
=~
m/\.W/
) || ($str
=~
m/\.B/
)) {
# Si $str contient une des balises que l'on veut
$Go
=
1
;
while
($Go
==
1
){
# Tant que l'on ne rencontre pas une nouvelle balise
chop
($str
=
<
F
>
);
if
(($str
eq
"\.W"
) || ($str
eq
"\.B"
) || ($str
eq
"\.N"
) || ($str
eq
"\.A"
) || ($str
eq
"\.X"
) || ($str
eq
"\.K"
) || ($str
eq
"\.T"
) || ($str
eq
"\.I"
)){
$Go
=
0
;
break
;
}
else{
print
NF
"$str "
; # On écrit le contenu dans le fichier CACM-XX
}
}
}
else{
chop
($str
=<
F
>
);
}
}
close
(F
);
}
CACM
-XX
un à un et qui pour chaque fichier, filtre tous les caractères non-alphanumérique et écrit le résultat (en minuscule) dans un autre fichier portant le même nom et avec l'extension .flt
en plus.
lc
et le filtre suivant
$I
=~
s/(\,|\=|\/|\.|\?|\'|\(|\)|\_|\$|\%|\+|\[|\]|\{|\}|\&|\;|\:|\~|\!|\@|\#|\^|\*|\||\<|\>|\-|\\s|\\)//g;