Expertise (5/5)
Perl est un langage très utilisé dans le monde UNIX. Ce langage dispose d'une trousse à outil colossale qui couvre tous les besoins de l'administrateur UNIX, ainsi que pratiquement tous les besoins fonctionnels d'une plateforme.
J'utilise régulièrement Perl depuis plus de 10 ans. J'ai développé de très gros logiciels avec ce langage, ainsi que des petits scripts pour dépanner.
Lorsque vous travaillez sur une plateforme informatique, il est courant de manipuler des données dont la date appartient à un interval donné. Par exemple :
- Un incident s'est produit. Pendant toute la durée de l'incident, certains traitements n'ont pas été effectués. Vous devez rattraper les traitements sur la plage temporelle qui correspond à l'incident.
- Chaque jour, à 3 heures du matin, vous devez traiter les informations de la vieille.
Le module ci-dessous permet d'exprimer des dates de façon absolue (relativement au calendrier en vigueur), ou de façon relative (relativement à une date donnée).
-
Exemple d'expression absolue : Le 21 janvier 2010, à minuit.
-
Exemples d'expressions relatives :
- Hier.
- Il y a deux jours.
- Hier, à midi.
- Trois jours avec le 1er mars 2009.
- Deux jours et 3 heures, avant le 1er mars 2010.
Exemple d'utilisation du module :
Le chargement dynamique de modules permet d'implémenter aisément une architecture à base de greffons (plugins).
Le code ci-dessous charge un ensemble de modules.
- Tous les modules à charger sont stockés sous le même répertoire (dont le chemin est déterminé par la valeur de $MODULES_DIR).
- Chaque module exporte la liste des fonctions qu'il exporte.
L'analyse d'emails n'est pas une tâche triviale. Ce module permet d'extraire tous les fichiers joints à un email, ainsi que les adresses de l'envoyeur et du destinataire.
Exemple d'utilisation.
Dans le secteur des télécommunications, il est courant de devoir factoriser des plages de numéros de téléphone. Cette opération est nécessaire pour la configuration de certains équipements téléphoniques. Le module ci-dessous effectue cette opération de factorisation.
Exemple : On considère l'ensemble de 15 numéros présentés ci-dessous.
Dans cet exemple, pour des raisons de clarté, les numéros sont triés par ordre croissant.
Cela dit, il n'est pas nécessaire de classer les numéros pour utiliser le module.
Le principe est le suivant :
- On détecte les suites de numéros qui comportent une puissance de 10 éléments: 10, 100, 1000, ... On crée ainsi des suites de numéros.
- Le plus petit numéro de chaque suite ainsi constitué doit se terminer par un zéro (ex: 0147300600).
- Chaque suite ainsi constituée fait l'objet d'une factorisation.
- 0147300600
- 0147300601
- 0147300602
- 0147300603
- 0147300604
- 0147300605
- 0147300606
- 0147300607
- 0147300608
- 0147300609
- 0147300610
- 0147300611
- 0147300612
- 0147300613
- 0147300614
Dans l'exemple ci-dessous, les numéros en rouge constituent une suite de 10 numéros.
Cette suite sera factorisée de la façon suivante : "014730060".
Le texte ci-dessous illustre la procédure à suivre pour envoyer un fichier en pièce jointe par SMTP.
Connectez-vous au serveur SMTP et entrez les commandes suivantes :
telnet smtp.tiscali.fr 25
Trying 213.36.80.74...
Connected to mail-tiscali.libertysurf.net.
Escape character is '^]'.
220 mail.libertysurf.net ESMTP Service (6.5.026) ready
EHLO fr.tiscali.com
250-mail.libertysurf.net
250-DSN
250-8BITMIME
250-PIPELINING
250-HELP
250-AUTH
250-DELIVERBY 300
250 SIZE 5120000
MAIL FROM:<denis.beurive@fr.tiscali.com>
250 MAIL FROM:<denis.beurive@fr.tiscali.com> OK
RCPT TO:<denis_beurive@yahoo.com>
250 RCPT TO:<denis_beurive@yahoo.com> OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Ensuite, envoyer la «partie de donnée» (data part). Le fichier à envoyer est encodé en base 64. Le nom du fichier envoyé est "to_send".
- Le texte en noir représentent l'entête de la "partie de donnée".
- Le texte en bleu représente le corps du fichier.
Message-ID: <3F3377BA.9A669F60@yahoo.com>
Date: Fri, 08 Aug 2003 12:13:14 +0200
From: Tiscali user <denis.beurive@fr.tiscali.com>
Reply-To: denis_beurive@yahoo.com
To: denis_beurive@yahoo.com
Subject: attached file
Content-Type: multipart/mixed; boundary="====1060343816====";
--====1060343816====
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
This is the attached file
--====1060343816====
Content-Type: application/octet-stream; name="to_send"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="to_send"
dXNlIGxpYiAiL2V4cG9ydC9jb21tb24tcGVybC1saWIvbXlfcGFja2FnZXMvIjsKdXNlIHN0cmlj
dDsKdXNlIGZpbGVyOwoKCm15ICRyYzsKbXkgJGVycjsKbXkgJGhvc3Q7Cm15ICRwb3J0OwpteSAk
bG9naW47Cm15ICRwYXNzOwpteSAkcGF0aDsKbXkgJG5hbWU7Cm15ICRjaGVja19wZXJpb2Q7Cm15
ICR2YWxpZF9hZ2U7Cm15ICRtYXhfcmVjb25uZWN0OwpteSAkd2FpdF9yZWNvbm5lY3Q7CgojIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENoZWNr
IGNvbW1hbmQgbGluZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQoKaWYgKGludCBAQVJHViAhPSAxMCkKewogIHByaW50ICJVc2FnZTogcGVybCBm
dHAucGwgPGhvc3Q+IDxwb3J0PiA8bG9naW4+IDxwYXNzd29yZD4gPGZpbGUgcGF0aD4gPGZpbGUg
bmFtZT4gIiAuCiAgICAgICAgIjxjaGVjayBwZXJpb2Q+IDx2YWxpZCBhZ2U+IDxtYXggcmVjb25u
ZWN0PiA8d2FpdCByZWNvbm5lY3Q+XG5cbiI7CiAgZXhpdCAxOwp9CgokaG9zdCAgICAgICAgICAg
PSAkQVJHVlswXTsKJHBvcnQgICAgICAgICAgID0gJEFSR1ZbMV07CiRsb2dpbiAgICAgICAgICA9
ICRBUkdWWzJdOwokcGFzcyAgICAgICAgICAgPSAkQVJHVlszXTsKJHBhdGggICAgICAgICAgID0g
JEFSR1ZbNF07CiRuYW1lICAgICAgICAgICA9ICRBUkdWWzVdOwokY2hlY2tfcGVyaW9kICAgPSAk
QVJHVls2XTsKJHZhbGlkX2FnZSAgICAgID0gJEFSR1ZbN107CiRtYXhfcmVjb25uZWN0ICA9ICRB
UkdWWzhdOwokd2FpdF9yZWNvbm5lY3QgPSAkQVJHVls5XTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgV2FpdCBmb3IgdGhlIGZpbGUgdG8g
YmVjb21lIGF2YWlsYWJsZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQoKJHJjID0gd2FpdF9mb3JfZmlsZV9mdHAgKAogICAgICAgICAgICAgICAg
ICAgICAgICAgICRob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0LAogICAgICAg
ICAgICAgICAgICAgICAgICAgICRsb2dpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFz
cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGgsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgJG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrX3BlcmlvZCwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAkdmFsaWRfYWdlLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICRtYXhfcmVjb25uZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICR3YWl0X3JlY29u
bmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBcJGVyciwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICApOwoKaWYgKCRyYyA9PSAtMSkKewog
IHByaW50ICJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBmaWxlICckcGF0aCcgLT4gJyRuYW1lJyB0
byBiZSBhdmFpbGFibGU6ICRlcnJcblxuIjsKICBleGl0IDE7Cn0KCnByaW50ICJGaWxlICckcGF0
aCcgLT4gJyRuYW1lJyBpcyBhdmFpbGFibGVcblxuIjsKCgoKZXhpdCAwOwo=
--====1060343816====--
Enfin, envoyer la séquence suivante : .
Le script ci-dessous génère le texte qui correspond au contenu di fichier envoyé (partie en bleu, dans l’exemple précédent).
Par défaut, Perl détecte la chaîne la plus longue qui vérifie l’expression régulière. Ce comportement est appelé «greedy match».
ls -l projet/symlink.pl
lrwxr-xr-x 1 denisbeurive staff 12 8 nov 12:46 projet/symlink.pl -> test/test.pl
Résultat :