SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
Vous pouvez retirer un signe seul ou une suite de signes d'une chaîne de caractères plus grande.
#!/usr/bin/perl $Url = "http://www.selfhtml.com.fr/selfhtml/tgck.htm"; $Stop = index($Url,":"); $protocole = substr($Url,0,$Stop); $Start = index($Url,"//") + 2; $domaine = substr($Url,$Start); $Stop = index($domaine,"/"); $domaine = substr($domaine,0,$Stop); $Start = rindex($Url,"/") + 1; $nomfichier = substr($Url,$Start); $longURL = length($Url); print "Le protocole Internet utilisé par l'adresse URL est: ", $protocole, "\n"; print "L'adresse domaine de l'adresse URL est: ", $domaine, "\n"; print "Le nom de fichier de lö'adresse URL est: ", $nomfichier, "\n"; print "Le nombre de caractères de l'adresse URL est : ", $longURL, " lettres\n"; |
Dans l'exemple ci-dessus sont extraits d'une adresse URL sauvegardée dans la variable scalaire simple $Url, le protocole Internet (dans l'exemple: http),
l'adresse domaine (dans l'exemple: www.teamone.de) et le nom de fichier (dans
l'exemple: tgck.htm). Les trois parties de l'adresse URL sont
sauvegardées dans des variables scalaires simples distinctes. Le protocole Internet
est sauvegardé dans $protocole, l'adresse domaine dans $domaine
et le nom de fichier dans $nomfichier. À la fin du script, les parties
trouvées sont sorties avec la fonction print.
La fonction
Perl, à l'aide de laquelle vous pouvez extraire une partie de chaîne
de caractères d'une plus grande chaîne de caractères, s'appelle substr (=
sous-chaîne de caractères). Cette fonction attend deux ou trois
paramètres. Le premier paramètre est la chaîne de caractères dont il faut
extraire une partie. Le deuxième paramètre est un nombre qui définit le signe de
la chaîne de caractères à partir duquel la partie de chaîne de caractères
doit être extraite. Il est important de commencer à compter par 0 (pour le premier
caractère). Si par exemple vous notez substr(Serge,2) la fonction
retourne rge. Comme troisième paramètre, vous pouvez encore
communiquer à substr le nombre de signes qui doivent être
extraits à partir du signe de départ mentionné. Si vous notez par exemple substr(Serge,2,2),
vous obtenez comme résultat rg.
Il est cependant fréquent que vous ne sachiez pas à partir de quel signe d'une chaîne de caractères la partie désirée adéquate commence. Par contre vous savez que la chaîne de caractères a une certaine construction. Il en va ainsi dans l'exemple ci-dessus. La chaîne de caractères représente une adresse URL. Les adresses URL ont, comme on sait, une construction uniforme. Si vous voulez par exemple extraire, comme dans l'exemple, l'adresse domaine d'une adresse URL, vous savez que l'adresse domaine commence derrière la double barre oblique //. Perl propose pour cela les fonctions index et rindex. Avec index vous trouvez à quelle position d'une chaîne de caractères se trouve un signe déterminé ou une suite de signes déterminés pour la première fois. Avec rindex vous trouvez à quelle position d'une chaîne de caractères se trouve un signe déterminé ou une suite de signes déterminés pour la dernière fois. Les deux fonctions attendent deux paramètres. Comme premier paramètre transmettez la chaîne de caractères dans laquelle doit être recherchée l'existence d'un signe ou d'une suite de signes. Comme deuxième paramètre la fonction reçoit le signe ou la suite de signes qui doit être recherché. Les deux fonctions renvoient ensuite un nombre. Vous pouvez ensuite transmettre ce nombre comme deuxième paramètre à substr. Si vous notez par exemple index("Opa prit de l'Opium","Op"), la valeur retournée sera 0 parce que "Op" se trouve pour la première fois tout au début. Si par contre vous notez rindex("Opa prit de l'Opium","Op"), la valeur retournée sera 14, étant donné que dans ce cas la dernière occurrence de "Op" est trouvée.
Il est indiqué de sauvegarder les valeurs retournées par toutes ces fonctions Perl dans des variables scalaires simples définies à cet effet, comme dans l'exemple ci-dessus. Ces variables scalaires simples peuvent ensuite être commodément traitées.
Une autre fonction intéressante pour les chaînes est length (voir l'exemple). Cette fonction retourne le nombre de signes dans une chaîne de caractères.
![]() ![]() |
Si vous avez des chaînes de caractères contenant certains signes revenant
régulièrement, vous pouvez traiter ces signes comme caractères de séparation,
et reporter la chaîne de caractères dans une liste.
$ligne_CSV = "Ludivine Créancier,13 rue de l'horloge,13860 Peyrolles,04 42578962"; @Adresse = split(/,/,$ligne_CSV,4); $i = 0; for(@Adresse) { print $i+1, "ème champ de l'adresse: ", $Adresse[$i], "\n"; $i++; } |
Dans l'exemple ci-dessus, une ligne typique d'un fichier délimité par des
virgules est sauvegardé dans la variable scalaire simple $ligne_CSV. Beaucoup de programmes de bases de
données ou de feuilles de calcul offrent la possibilité de sauvegarder des
données structurées sous la forme de fichiers de ce genre délimité par des
virgules. Les fichiers de ce genre sont sauvegardés en règle générale avec
la terminaison .csv. Si vous voulez
lire
un tel fichier ligne par ligne, vous recevez dans chaque ligne un
contenu analogue à celui qui est sauvegardé dans $ligne_CSV dans
l'exemple ci-dessus.
Avec la fonction
Perl split vous pouvez diviser de tels contenus en champs et les sauvegarder dans une liste. Définissez une
liste
comme dans l'exemple la liste @Adresse. Affectez à cette liste la
valeur retournée par split. La fonction split attend
deux paramètres et même un troisième facultatif. Comme premier paramètre,
transmettez une
expression
régulière, à l'aide de laquelle seront trouvés les délimiteurs de
champs. Dans l'exemple ci-dessus, c'est tout simplement la virgule. Comme
deuxième paramètre, transmettez la chaîne de caractères à partir de laquelle
la liste doit être créée. Dans l'exemple c'est la variable scalaire simple $ligne_CSV.
Comme troisième paramètre, vous pouvez encore mentionner à la fonction split
combien de champs elle doit créer au maximum. Dans l'exemple ci-dessus, ce
n'est pas nécessaire mais par souci d'exhaustivité, 4 a été transmis car
c'est le nombre de champs contenus dans la ligne d'adresses.
![]() ![]() |
Vous pouvez former une chaîne de caractères à partir des éléments d'une liste.
#!/usr/bin/perl @Adresse = ("Ludivine Créancier,13 rue de l'horloge,13860 Peyrolles,04 42578962"); $ligne_CSV = join(",",@Adresse); print "La chaîne de caractères créée est: ", $ligne_CSV, "\n"; |
Dans l'exemple ci-dessus, vous avez sauvegardé une adresse dans une liste @Adresse
avec des champs pour les différentes données. Vous
pouvez transformer cette liste en une chaîne de caractères à l'aide de la fonction
Perl join. Il vous faut d'autre part mentionner par quel signe
ou suite de signes les champs doivent-ils être séparés dans la chaîne de
caractères à créer. La fonction join est donc la fonction inverse
de split.
Définissez une variable scalaire simple comme la
variable scalaire simple de l'exemple
$ligne_CSV. Affectez à cette variable scalaire simple la valeur retournée par join.
La fonction join attend deux paramètres. Comme premier paramètre,
transmettez le signe ou la suite de signes par laquelle les champs de la
chaîne de caractères doivent être séparés. Dans l'exemple, c'est tout
simplement la virgule. Comme deuxième paramètre transmettez la liste à partir
de laquelle la chaîne de caractères doit être créée. Dans l'exemple il
s'agit de la liste @Adresse.
![]() ![]() |
Une liste
n'a pas obligatoirement un contenu fixe et une taille fixe. Vous pouvez par exemple, ajouter
pendant le déroulement du programme des éléments à une liste ou en
retirer.
#!/usr/bin/perl @Adresse = ("Ludivine Créancier","13, rue de l'horloge","13860 Peyrolles","04 42578962"); push(@Adresse,"Ludivine\@free.fr"); for(@Adresse) { print $_, "\n"; } |
#!/usr/bin/perl @Adresse = ("Ludivine Créancier","13, rue de l'horloge","13860 Peyrolles","04 42578962"); pop(@Adresse); for(@Adresse) { print $_, "\n"; } |
#!/usr/bin/perl @Adresse = ("Ludivine Créancier","13, rue de l'horloge","13860 Peyrolles","04 42578962"); $Adresse[1] = "7, rue Aristide Briand"; for(@Adresse) { print $_, "\n"; } |
#!/usr/bin/perl @Adresse = ("Ludivine Créancier","13, rue de l'horloge","13860 Peyrolles","04 42578962"); for($i=1;$i<3;$i++) { $Temp = shift(@Adresse); push(@Adresse,$Temp); } for(@Adresse) { print $_, "\n"; } |
À l'aide de la fonction
Perl push vous pouvez ajouter un élément à une liste. Dans
l'exemple 1 ci-dessus, un élément contenant l'adresse électronique a été
ajoutée à la liste @Adresse. La fonction push reçoit,
lorsqu'elle est appelée, comme premier paramètre la liste à laquelle vous
voulez ajouter un ou plusieurs éléments. Donnez ensuite un ou plusieurs
éléments que vous voulez ajouter. Ceux-ci peuvent être des chaînes de caractères
ou des nombres. Dans l'exemple ci-dessus, seul un élément est ajouté, à
savoir l'adresse électronique. Si vous voulez ajouter plusieurs éléments,
séparez les par des virgules.
La barre oblique dans l'adresse électronique ne fait d'ailleurs pas partie de
l'adresse mais est un signe pour masquer le signe @, étant donné que ce signe
a une signification distincte en Perl (il marque des listes).
À l'aide de la fonction pop vous pouvez retirer le dernier élément d'une liste. Pour cela, transmettez simplement à l'appel de la fonction la liste dont vous voulez retirer le dernier élément. Dans l'exemple 2 ci-dessus, il s'agit de la liste @Adresse. Dans l'exemple, le numéro de téléphone est retiré de la liste.
Pour remplacer un élément déterminé dans une liste, adressez simplement l'élément concerné dans la liste et affectez lui une autre valeur, comme dans l'exemple 3 ci-dessus.
L'exemple 4 ci-dessus montre comment vous pouvez modifier "à la main" l'ordre des
éléments d'une liste. La fonction Perl shift
est appropriée pour cela. Cette fonction retire le premier élément d'une liste et
le retourne. Tous les autres éléments avancent d'une position de sorte que le
deuxième élément jusque là devient premier, etc. Pour que l'élément retiré
ne soit pas perdu, vous pouvez le sauvegarder dans une variable scalaire simple. Dans
l'exemple 4 ci-dessus l'élément retiré est sauvegardé dans la variable scalaire simple
$Temp. Cet élément est finalement ajouté à la fin de la
liste avec la fonction push. Dans l'exemple, cet échange a lieu dans
une boucle
for. De la sorte plusieurs éléments peuvent être
déplacés les uns aprè les autres. Dans l'exemple, la ville et le numéro de téléphone finissent par
se trouver au début de la liste, suivis du nom et de la rue.
![]() ![]() |
La possibilité de trier des liste est une fonction très puissante en Perl.
#!/usr/bin/perl @amies = ("Christine","Martine","Ludivine","Pauline","Justine","Sabine"); @ordre = sort(@amies); for(@ordre) { print $_, "\n"; } |
#!/usr/bin/perl @listedespoints = (9834,9837,5989,4509,4329,6509,2837,8289,10845); @listetriee = sort trinumero @listedespoints; @listetrieedecroiss = reverse @listetriee; for(@listetrieedecroiss) { print $_, "\n"; } sub trinumero { if($a < $b) { return -1; } elsif($a == $b) { return 0; } else { return 1; } } |
La fonction
Perl sort est disponible pour le tri automatique de listes.
Cette fonction trie automatiquement dans l'ordre alphabétique croissant les
éléments d'une liste transmise comme paramètre à la fonction. Si c'est
exactement ce que vous voulez obtenir, vous n'avez besoin que d'une commande,
comme dans l'exemple 1 ci-dessus: @ordre = sort(@amies). Dans cet
exemple la liste @amies est triée. La liste triée est
sauvegardée dans @ordre.
Il est plus difficile de trier des valeurs numériques, comme dans l'exemple
2 ci-dessus. Pour cela, vous avez besoin d'un sous-programme
distinct qui doit avoir une certaine structure, étant donné que la fonction sort
appelle ce programme sur demande. Vous pouvez utiliser le sous-programme trinumero
de l'exemple 2 pour toutes les missions semblables. Avec l'instruction @listetriee = sort
trinumero @listedespoints; de l'exemple, la liste @listedespoints
est triée numériquement. À l'appel de la fonction laissez de préférence
tomber les parenthèses pour noter derrière sort le nom du
sous-programme pour le processus de tri, dans l'exemple donc
trinumero. Suit la mention de la liste qui doit être triée de cette
façon, dans l'exemple @listedespoints.
Si vous voulez trier une liste dans un ordre décroissant au lieu d'un ordre croissant, vous pouvez utiliser la fonction Perl reverse. Dans l'exemple 2 ci-dessus, la liste @listetriee, triée d'abord dans l'ordre croissant, est sauvegardée dans une nouvelle liste nommée @listetrieedecroiss avec l'instruction @listetrieedecroiss = reverse @listetriee;. Cette liste est triée dans l'ordre décroissant.
![]() ![]() |
Le puissant outil des expressions
régulières est également souvent utilisé en Perl pour remplacer
certains signes ou suites de signes par d'autres dans des chaînes de
caractères. Il y a pour le faire une syntaxe spéciale.
#!/usr/bin/perl $texte = "Voyez le petit juge qui boit son whisky assis dans un fauteuil kaki 1234567890"; $texte =~ s/[a-z]| //gi; print $texte; |
#!/usr/bin/perl $texte = "De façon à ce que l'œuf soit cuit et étuvé, le caïman repère où est le cuisinier"; $texte =~ s/ç/\ç\;/g; $texte =~ s/œ/\&oelig\;/g; $texte =~ s/ï/\ï\;/g; $texte =~ s/é/\é\;/g; $texte =~ s/è/\è\;/g; $texte =~ s/à/\à\;/g; $texte =~ s/ù/\ù\;/g; print $texte; |
#!/usr/bin/perl @notesscolaires = (1,4,7,2,X,3,0,1,6,3,3,8,R,G,9,2,3,4,1,1,3); $chainenotes = join(",",@notesscolaires); $chainenotes =~ s/[7-9]|0|[A-Z]//gi; @notesneuves = split(/,|,,/,$chainenotes); for(@notesneuves) { unless($_ eq "") { print $_, "\n"; } } |
Le schéma pour tous les processus de recherche et remplacement en Perl est
le suivant:
chainecaracteres =~ s/recherche/remplace/[Options]
chainecaracteres est la plupart du temps une variable scalaire simple, dans laquelle est sauvegardée une chaîne de caractères, comme
par exemple $texte dans l'exemple 1 ci-dessus. Notez à la suite
l'affectation =~, suivie d'un espace et d'un s minuscule.
Juste derrière le petit s suit une expression régulière,
marquée par les barres obliques /.../. Dans cette expression de
recherche, définissez selon les règles pour les expressions régulières ce qui
doit être recherché dans la chaîne de caractères. Après la barre oblique de
fermeture, suit une deuxième expression. Notez dans cette expression le signe
ou la chaîne de signes par laquelle les occurrences doivent être remplacées.
Après suit encore une barre oblique de fermeture. Derrière cette barre
oblique, vous pouvez définir les options pour le processus de
recherche/remplacement. Les lettres importantes pour le faire sont les
suivantes :
g cherche/remplace toutes les occurrences (autrement, seule la
première occurrence est remplacée)
i cherche/remplace les lettres indépendamment du fait qu'elles soient
en majuscules ou en minuscules (autrement, la casse est respectée)
Dans l'exemple 1 ci-dessus toutes les lettres (minuscules et majuscules) ainsi que les espaces sont retirées de $texte. Ensuite, il ne reste plus à la fin que les chiffres.
Dans l'exemple 2 ci-dessus tous les signes particuliers français de $texte sont remplacés conformément à l'écriture HTML.
Dans l'exemple 3 ci-dessus toutes les valeurs non comprises entre 1 et 6 de
la liste @notesscolaires sont ôtées. Pour cela, les éléments
de la liste sont reliés à une chaîne de caractères. Tous les
chiffres non compris entre 1 et 6 sont retirés de cette chaîne de caractères
$chainenotes, ainsi que toutes les lettres. Le modèle de
remplacement reste vide ce qui conduit à retirer tout simplement les occurrences.
Ensuite la
chaîne
de caractères est transformée en liste après avoir été traitée.
Là tous les espaces vides laissés par le processus de recherche/remplacement
avec l'expression régulière /,|,,/ sont sautés. La nouvelle liste
ne contient plus que des notes scolaires valables entre 1 et 6.
![]() | |
après:![]() |
![]() |
avant:![]() |
![]() |
SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
Serge François, 13405@free.fr