SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl


Manipuler des chaînes de caractères et des listes

Cette page est un document avec du texte et des informations

 Extraire des parties de chaînes de caractères
 Transformer des chaînes de caractères en listes
 Relier des éléments de liste à une chaîne de caractères
 Ajouter, remplacer et effacer des éléments de liste
 Trier des éléments de liste
 Rechercher et remplacer des signes ou des chaînes de caractères

 

Extraire des parties de chaînes de caractères

Vous pouvez retirer un signe seul ou une suite de signes d'une chaîne de caractères plus grande.

Exemple:

#!/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";

Explication:

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.

Attention:

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.

 

Transformer des chaînes de caractères en listes

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.

Exemple:

$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++;
 }

Explication:

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.

 

Relier des éléments de liste à une chaîne de caractères

Vous pouvez former une chaîne de caractères à partir des éléments d'une liste.

Exemple:

#!/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";

Explication:

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.

 

Ajouter, remplacer, effacer des éléments de liste

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.

Exemple 1: ajouter un élément:

#!/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";
 }

Exemple 2: retirer un élément

#!/usr/bin/perl

@Adresse = ("Ludivine Créancier","13, rue de l'horloge","13860 Peyrolles","04 42578962");
pop(@Adresse);
for(@Adresse)
 {
  print $_, "\n";
 }

Exemple 3: remplacer un élément

#!/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";
 }

Exemple 4: modifier l'ordre des éléments

#!/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";
 }

Explication:

À 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.

 

Trier les éléments de la liste

La possibilité de trier des liste est une fonction très puissante en Perl.

Exemple 1: trier des chaînes de caractères

#!/usr/bin/perl

@amies = ("Christine","Martine","Ludivine","Pauline","Justine","Sabine");
@ordre = sort(@amies);
for(@ordre)
 {
  print $_, "\n";
 }

Exemple 2: trier des nombres

#!/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; }
}

Explication:

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.

 

Rechercher et remplacer des signes ou des chaînes de caractères

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.

Exemple 1: retirer toutes les lettres et les espaces

#!/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;

Exemple 2: Remplacer les signes particuliers conformément à HTML

#!/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/ç/\&ccedil\;/g;
$texte =~ s/œ/\&oelig\;/g;
$texte =~ s/ï/\&iuml\;/g;
$texte =~ s/é/\&eacute\;/g;
$texte =~ s/è/\&egrave\;/g;
$texte =~ s/à/\&agrave\;/g;
$texte =~ s/ù/\&ugrave\;/g;
print $texte;

Exemple 3: ôter et ignorer les mentions erronées

#!/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";
   }
 }

Eexplication:

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: Travailler avec des nombres et le temps
avant: Lire et écrire des fichiers
 

SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl

© 1998 Stefan Münz / © 2001 Traduction  Serge François, 13405@free.fr