Title: Perl
1Perl
- Sources
- http//www.cs.utk.edu/plank/plank/classes/cs494/n
otes/Perl/lecture.html - Randal L. Schwartz and Tom Christiansen,Learning
Perl 2nd ed., OReilly - Randal L. Schwartz and Tom Phoenix,Learning
Perl 3rd ed., OReilly - Dr. Nathalie Japkowicz, Dr. Alan Williams
CSI 3525, Perl, page 1
2Perl
- Perl est inspiré du langage C et dinterpréteurs
de commande Unix comme sed, awk, et sh. - La facilitée de manipulation de texte, fichiers
et processus par Perl font quil est populaire
pour le prototypage rapide, les outils de système
dexploitation, laccès aux bases de données, la
gestion de réseaux, et la programmation pour le
web. - - Populaire pour ladministration de systèmes et
les scriptes CGI.
3Survol (1)
- Perl Practical Extraction and Report Language
- Aussi (Pathologically Eclectic Rubbish Lister )
- Un langage puissant et générale.
- Utile pour des programmes quick and dirty.
- Développé by Larry Wall, sans excuse pour le
manque délégance. - Facile à apprendre pour quelquun qui connaît C
et Unix.
4Survol (2)
- Perl nest pas tout à fait un langage de haut
niveau, il se trouve entre C ou C et les shell
scripts (des langages qui ajoutent des structures
de contrôle à linterpréteur de commande Unix)
tel que sh, sed et awk. - awk langage qui permet de lire des patrons et
exécuter des commandes selon ce qui est lu. - sed permet de modifier des fichiers texte
- sh peut exécuter plusieurs instructions de
linterpréteur de commandes, contenu dans un
fichier (comme les fichiers batch de DOS).
5Avantages de Perl (1)
- Selon certains, Perl combine les meilleurs
aspects de - Unix/Linux shell programming,
- Les commandes sed, grep, awk et tr,
- C,
- Cobol.
- - tr permet déliminer ou de substituer des
caractères dans un texte. - Les shell scripts sont normalement écrit dans
plusieurs petits fichiers referant les uns aux
autres. Perl permet les même résultats avec un
seul programme dans un fichier.
6Avantages de Perl (2)
- Perl incorpore des capacité puissante de
traitement des expressions régulières. Ceci
permet un traitement de chaînes de caractères
très rapide, fiable et flexible, surtout pour le
filtrage de texte (pattern matching). - Conséquemment, Perl est particulièrement utile
pour le traitement de chaînes de caractères. - En fait, Perl à permis de rapidement traduire
plusieurs documents texte en HTML au début des
années 1990,permettant au web de prendre beaucoup
dexpansion.
7Désavantages de Perl
- Ce nest pas un langage élégant. Plutôt une
combinaison de plusieurs éléments provenant de
différent langages et outils. - Contient plusieurs façons différentes daccomplir
la même chose (plusieurs instructions de boucle
ou expressions conditionnelles). - ?un langage peu lisible
- Les programmes ne sont pas compilé en fichier
binaires, mais sont plutôt exécuté directement à
partir du texte. Ainsi, il est difficile de
commercialiser des programmes développé en Perl.
8Perl ressources et versions
- http//www.perl.org vous dira tout ce que vous
avez toujours voulu savoir sur le Perl. - Ce que nous allons voir dans ce cours est le Perl
5. - Perl 5.8.0 a été déployé en Juillet 2002.
- Perl 6 (http//dev.perl.org/perl6/) est la
prochaine version, qui nest pas encore prête,
mais qui sera bientôt déployée. Le premier livre
sur le Perl 6 se vend déjà (http//www.oreilly.com
/catalog/perl6es).
9Scalaires chaînes de caractères et nombres
- Les scalaires de sont pas nont pas à être
déclaré. - Perl comprend à partir du contexte.
- Fichier hellos.pl
- ! /usr/bin/perl
- print "Hello" . " " . "world\n"
- print "hi there " . 2 . " worlds!" ."\n"
- print (("5" 6) ." eggs\n" . " in " . " 3 2
" . ("3" "2") . " baskets\n" )
invoque Perl
hellos.pl Hello world hi there 2 worlds! 11
eggs in 3 2 5 baskets
10Variables scalaire
- Les variables scalaires commencent par un .
Elles nont pas à être déclarée.
cat scalar.pl ! /usr/bin/perl i 1 j
"2" print "i and j \n" k i j print
"k\n" print i . j . "\n" print 'k\n' . "\n"
scalar.pl 1 and 2 3 12 k\n
11Guillemets et substitution
- Supposons x 3
- Les apostrophes ' ' ne permettent aucune
substitutions sauf pour les séquences
déchappement \\ et \'. - print('x\n') donne x\n et pas de nouvelle
ligne. - Les guillemets " " permettent la substitution de
variables comme x et des séquences déchappement
comme \n (newline). - print("x\n") donne 3 (avec la nouvelle ligne).
- Les accents graves permettent les
substitution, et tentent dexécuter les commandes
de système résultant. Ils retournent la sortie
du système. - y date print(y) donne
- Mon Aug 12 144824 EDT 2002
12Instructions de contrôle if, else, elsif
cat names.pl ! /usr/bin/perl name
ltSTDINgt chomp(name) if (name gt 'fred')
print "name follows 'fred'\n" elsif (name
eq 'fred') print "both names are
'fred'\n" else print "name precedes
'fred'\n"
Input standard
élimine le newline
names.pl Stan 'Stan' precedes 'fred'
input de lutilisateur
Output de Perl
- names.pl
- stan
- 'stan' follows 'fred'
13Instructions de contrôle boucles (1)
cat oddsum_while.pl ! /usr/bin/perl Add up
some odd numbers max ltSTDINgt n 1 while
(n lt max) sum n n 2 On to
the next odd number print "The total is sum.\n"
- oddsum_while.pl
- 10
- Use of uninitialized value at oddnums.pl line 6,
ltSTDINgt chunk 1. (the sum) - The total is 25.
Input de lutilisateur
warning
Output de Perl
14Instructions de contrôle boucles (2)
- Les commentaires débutent par
- On peut utiliser une variable sans linitialiser
(comme sum). Elle sera initialiser à 0 si elle
est dabord utilisée comme un nombre, ou à la
chaîne vide "" si elle est dabord utilisée comme
chaîne de caractères. En fait, cest toujours
undef, qui est converti selon le contexte. - Le flag -w demande à Perl dindiquer les
warnings. - Il y a plusieurs autres instructions de boucles
15Instructions de contrôle boucles (3)
- cat oddsum_until.pl
- ! /usr/bin/perl
- Add up some odd numbers
- max ltSTDINgt
- n 1
- sum 0
- until (n gt max)
- sum n
- n 2 On to the next odd number
- print "The total is sum.\n"
- oddsum_until.pl
- 10
- The total is 25.
16Instructions de contrôle boucles (4)
- cat oddsum_for.pl
- ! /usr/bin/perl
- Add up some odd numbers
- max ltSTDINgt
- sum 0
- for (n 1 n lt max n 2)
- sum n
- print "The total is sum.\n"
- oddsum_for.pl
- 10
- The total is 25.
- Il y a aussi do-while et do-until.
17Instructions de contrôle boucles (5)
- cat oddsum_foreach.pl
- ! /usr/bin/perl
- Add up some odd numbers
- max ltSTDINgt
- sum 0
- foreach n ( (1 .. max) )
- if ( n 2 ! 0 ) sum n
- print "The total is sum.\n"
- oddsum_foreach.pl
- 10
- The total is 25.
18Comparaison avec C
C Perl
même chose if () ... if () ...
différent else if () ... elsif () ...
même chose while () ... while () ...
même chose for (aabbcc) ... for (aabbcc) ...
foreach v (_at_array)...
différent break last
différent continue next
similaire 0 est FALSE 0, "0", and "" sont FALSE
similaire ! 0 est TRUE Tout ce qui nest pas FALSE est TRUE
19Listes et tableaux
- Une liste est une collection ordonnée de
scalaires. Un tableau est une variable contenant
une liste. - Chaque élément est un scalaire indépendant. Une
liste peut contenir des nombres, chaînes de
caractères, undef, ou tout mélange de différent
scalaires. - Pour utiliser un tableau, places un devant et
utilises les (ex a2). - Pour accéder au tableau en entier _at_.
- On peut copier un tableau, et utiliser les
opérateurs sort, reverse, push, pop, split.
20Examples de tableaux (0)
- cat somme_de_carre.pl
- ! /usr/bin/perl
- s ltSTDINgt
- for (i0 ilts i1)
- ai ii
-
- print _at_a
- print "\n"
- somme_de_carre.pl
- 4
- 0
21Paramètre de lappel au programme (comand-line
argument)
- Si un programme Perl écrit dans un fichier
myProg.pl est invoqué par la commande - myProg.pl -o big.basket.htm candle.htm
- La liste _at_ARGV , prédéfinie dans Perl, contient
alors - ('-o', 'big.basket.htm', 'candle.htm')
- Ces éléments peuvent être accédés
par ARGV0 ARGV1 ARGV2
22Exemples de tableau (1)
- cat arraysort.pl
- ! /usr/bin/perl
- i 0
- while (k ltSTDINgt)
- ai k
- print " sorted \n"
- print sort(_at_a)
- arraysort.pl
- Nathalie
- Frank
- hello
- John
- Zebra
- notary
- nil
sorted Frank John Nathalie Zebra hello
nil notary
control-D (pour arrêter la boucle)
23Exemples de tableau (2A)
Inverser un texte (lignes entières). cat
whole_rev.pl ! /usr/bin/perl while (k
ltSTDINgt) push(_at_a, k) print " reversed
\n" while (oldval pop(_at_a)) print
oldval
- whole_rev.pl
- a b c d
- e f
- g h i
- reversed
- g h i
- e f
- a b c d
control-D
24Exemples de tableau (2B)
Inverser les lignes dun texte
cat each_rev.pl ! /usr/bin/perl while(k
ltSTDINgt) _at_a split(/\s/, k) s "" for
(i _at_a i gt 0 i--) s
"sai-1 " chop(s) print "s\n"
- each_rev.pl
- a bc d efg
- efg d bc a
- hi j
- j hi
- klm nopq st
- st nopq klm
control-D
output
split sépare les lignes aux espaces chop élimine
le dernier caractère (un espace)
25Exemples de tableau (3)
- Inverser les lignes
- print reverse(ltSTDINgt)
- Inverser chaque ligne
- while(k ltSTDINgt)
- s ""
- foreach i
- (reverse(split(/\s/, k)))
- s "si "
- chop(s)
- print "s\n"
-
26Une digressionLa variable défaut favorite du
Perl
par défaut,Perl lit dans _
while(ltSTDINgt) s "" foreach i
(reverse(split(/\s/, _))) s "si "
chop(s) print "s\n"
par défaut,Perl sépare _ également!
while(ltSTDINgt) s "" foreach i
(reverse(split(/\s/ ))) s "si "
chop(s) print "s\n"
27Haches
- Un hache est semblable à un tableau, mais au lieu
des entiers comme index, un hache peut utiliser
nimporte quoi comme clef. Les accolades
sont utilisées au lieu des parenthèses carrées
. - Le nom officiel est tableau associatif
(implémenté par hachage). - Les clefs et valeurs peuvent être nimporte quel
scalaire. Les clefs sont toujours convertie en
chaînes de caractères. - Pour référer au hache en entier, on place un
devant. - Si un hache est assigné à un tableau, il devient
une liste.
28exemple I (1)
- cat hash_array.pl
- ! /usr/bin/perl
- some_hash
- ("foo", 35, "bar", 12.4, 2.5, "hello",
- "wilma", 1.72e30, "betty", "bye\n")
- _at_an_array some_hash
- print "_at_an_array\n\n"
- foreach key (keys some_hash)
- print "key "
- print delete some_hashkey
- print "\n"
29exemple I (2)
- hash_array.pl
- betty bye
- wilma 1.72e30 foo 35 2.5 hello bar 12.4
-
- betty bye
- wilma 1.72e30
- foo 35
- 2.5 hello
- bar 12.4
some_hash ("foo", 35, "bar", 12.4, 2.5,
"hello", "wilma", 1.72e30, "betty",
"bye\n") _at_an_array some_hash print
"_at_an_array\n\n" foreach key (keys
some_hash) print "key " print delete
some_hashkey print "\n"
30exemple II
cat hash_arrows.pl ! /usr/bin/perl my hash
( "a" gt 1, "b" gt 2, "c" gt 3) foreach key
(sort keys hash) value hashkey
print "key gt value\n"
- hash_arrows.pl
- a gt 1
- b gt 2
- c gt 3
31Un petit interludelopérateur diamand
cat concat !/usr/bin/perl -w while ( ltgt )
print _
cat a one-a two-a cat b three-b four-b five-b
concat a b one-a two-a three-b four-b five-b
ltgt Fait une boucle sur tous les fichiers listés
dans les arguments de la ligne de commande
concat a b gtc cat c one-a two-a three-b four-b
five-b
32exemple III Fréquence de caractères
- cat frequency.pl
- ! /usr/bin/perl
- while (ltgt)
- loop over characters in input line
- foreach c (split //)
- Increment count of c
- countc
-
- end of input, print count
- for c (sort keys count)
- print "c\tcountc\n"
33Fréquence de caractères (2)
- frequency.pl
- Nathalie
- Fran
- hello
- John
- rather
- Notary
- F 1
- J 1
\n
8 2 1 2 F 2 J
2 N 2 a 5 e 3 h 4 i
1 l 3 n 2 o 3 r 4 t
3 y 1
space
D
34Sous-programmes
- Un sous-programme est une fonction définie par
lutilisateur. La syntaxe est très simple. La
sémantique aussi.
! /usr/bin/perl sub max if ( x gt y ) x
else y x 10 y 11 print max .
"\n"
- Il ny a pas darguments le script accède a deux
variables globales. Lappel de sous-programme
sindique avec un . La valeur retournée est
celle de la dernière expression évaluée.
35Sous-programmes (2)
- Quelques règles utiles.
- Vous pouvez placer vos définitions nimporte où
dans vos fichiers. Néanmoins, il est recommandé
de les mettre au début. - Perl utilise toujours la dernière définition dans
le fichierles précédentes sont ignorées. - Certains éléments de syntaxe sont optionnels.
- Le peut parfois être omit (mais cela nest pas
une bonne idée) - Lopérateur return peut précéder une valeur a
retourner (cela peut être utile) - if ( x gt y ) return x
- else return y
36Sous-programmes (3)
- Il est clair que lutilisation seule de variables
globales est trop limitée. Les sous-programmes
peuvent prendre des arguments et les utiliser
grâce a une variable de liste _at__ prédéfinie ou
ses éléments _0, _1, etc
! /usr/bin/perl sub max if ( _0 gt _1 )
_0 else _1 print max ( 12, 13
) . "\n"
37Sous-programmes (4)
- _0, _1 ne sont pas faciles à utiliser. Vous
pouvez les re-nommer localement en utilisant
lopérateur myIl crée les variables privées dun
sous-programme. Ici, on déclare deux variables de
ce type et on les initialise immédiatement.
! /usr/bin/perl sub max my ( a, b ) _at__
if ( a gt b ) a else b print max (
15, 14 ) . "\n"
38Sous-programmes (5)
- Mais ceci nest pas un calcul du maximum bien
conçu
! /usr/bin/perl sub max my ( a, b ) _at__
if ( a gt b ) a else b print max (
16, 19, 23 ) . "\n" print max ( 26 ) . "\n"
- Il produit 19 (23 est ignoré) et 26 (la deuxième
valeur est undef, ce qui veut dire 0)
39Sous-programmes (6)
- On pourrait stopper le sous-programme si le
nombre darguments était le mauvais. Lopérateur
(très utile) die le fait pour nous.
! /usr/bin/perl sub max if ( _at__ ! 2 )
die "max needs two arguments _at__\n" my (
a, b ) _at__ if ( a gt b ) a else b
print max ( 16, 19, 23 ) . "\n"
Le script est stoppé après avoir imprimé max
needs two arguments 16 19 23
40Sous-programmes (7)
- On peut choisir de navoir quun warning avec
lopérateur warn.
! /usr/bin/perl sub max if ( _at__ ! 2 )
warn "max needs two arguments _at__\n" my (
a, b ) _at__ if ( a gt b ) a else b
print max ( 16, 19, 23 ) . "\n"
Le script imprime max needs two arguments 16 19
23 19
41Sous-programmes (8)
- De toutes façons, ce nest pas une mauvaise idée
de généraliser max en lui permettant de prendre
nimporte quel nombre darguments.
! /usr/bin/perl sub max my ( curr_max )
shift _at__ foreach ( _at__ ) if ( _ gt
curr_max ) curr_max _
curr_max print max ( 15, 14 ) . "\n" print
max ( 16, 19, 23 ) . "\n" print max ( 26 ) .
"\n"
42Sous-programmes (9)
- Cela marche même pour les listes vides.
! /usr/bin/perl sub max my ( curr_max )
shift _at__ foreach ( _at__ ) if ( _ gt
curr_max ) curr_max _
curr_max z max ( ) if ( defined z )
print z . "\n" else print "undefined\n"
43Expressions régulières (1)
- Une expression régulière (patron) décrit une
classe de chaînes de caractères. - Une chaîne de caractères peut matcher ou non le
patron. - Le patron le plus simple est un seul caractère.
- Une classe de caractères est écrite entre
parenthèses carrées - 01234567 un chiffre octal
- 0-7 un chiffre octal
- 0-9A-F un chiffre hexadécimale
- A-Za-z pas une lettre
- 0-9- un chiffre décimale ou un moins (-)
44Expressions régulières (2)
- Metacaractères
- . (point) nimporte quel caractère sauf \n
- Ancres
- le debout dune chaîne de caractères
- la fin
- Multiplicateurs
- répète ce qui précède 0 fois ou plus
- répète ce qui précède 1 fois ou plus
- ? ce qui précède devient optionnel
- n répète n fois
- n, m répète de n à m fois (n lt m)
- n, répète n fois ou plus
45Expressions régulières (3)
- Lopérateur Booléen essaye de matcher une
chaine avec une expression régulière écrite entre
deux barres inclinées (slashes).
x "01239876AGH" if ( x /01-94,/ )
print "yes1\n" if ( x /A-Z3/ )
print "yes2\n" if ( x /.A-Z4/ )
print "yes3\n"
46Expressions régulières (4)
- Lopérateur booléen matche une chaîne à un
patron, écrit entre barres obliques /. - Les patrons peuvent être regroupes entre
parenthèses (le patron en entier devient un
item). - Les alternatives sont séparées par la barre .
- x "01239876AGH"
- if ( x /(0-94A-Z3)2,/ )
- print "yes4\n"
- if ( x /(0?4)(51abc1,)/ )
- print "yes5\n"
to be explained shortly
47Expressions régulières (5)
- La précédence des éléments dun patron
- parenthèses ( )
- multiplicateurs ? n
- séquence, ancres
- alternatives
- Certaines classes de caractères sont prédéfinies
- classe C non C
- chiffres \d \D
- caractères a-zA-Z0-9_ \w \W
- espaces blanc \s \S
- Autre ancres
- frontières entre les mots \b \B
48Exemple (1)
- i "Jim"
- match
- i /Jim/ oui
- i /J/ non
- i /j/ non
- i /j/i oui
- i /\w/ oui
- i /\W/ non
- La différence majuscule-minuscule est ignorée si
postfix i est utilisé.
49Exemple (2)
- j "JjJjJjJj"
- j /j/ oui pour nimporte quoi
- j /j/ oui matche le premier j
- j /j?/ oui matche le premier j
- j /j2/ non
- j /j2/i oui ignore majuscule-minuscule
- j /(Jj)3/ oui
50Exemple (3)
- k "Boom Boom, out go the lights!"
- k /JimBoom/ oui matche Boom
- k /(Boom)2/ non un espace entre Booms
- k /(Boom )2/ non la virgule
- k /(Boom\W)2/ oui
- k /\bBoom\b/ oui les mots sont séparés
- k /\bBoom.the\b/ oui
- k /\Bgo\B/ non "go" est un mot
- k /\Bgh\B/ oui le "gh" dans "lights"
51Substitution dexpressions régulières (1)
- On peut modifier une variable de type string en
appliquant une substitution. - Lopérateur est et la substitution est écrite
comme il suit - s/pattern1/pattern2/
- v "a string to play with"
- v s/\w/just a single/
- print "v\n"
- just a single string to play with
52Substitution dexpressions régulières (2)
- Les patrons matchés sont sauvegardés dans les
variables préconstruites 1, 2, 3 etc. Ces
variables gardent leurs valeurs jusquà
lopération de match suivante. Chaque paire de
parenthèses dun patron correspond à une variable
de mémoire - v "just a single string to play with"
- v s/(\b\w\b)(.)/'1'2/
- print "v\n"
- print "2, 1 1\n"
- 'just' a single string to play with
- a single string to play with, just just
53Substitution dexpressions régulières (3)
- Une substitution peut être appliquée à toutes les
incidences du patron, cest à dire, globalement
- s/pattern1/pattern2/g
- v "'just' a single string to play with"
- v s/\b\w\b/word/g
- print "v\n"
- 'word' word word word word word word
- v s/\b\w\b/last/
- print "v\n"
- 'word' word word word word word last
54Substitution dexpressions régulières (4)
Les parenthèses utilisées comme de la mémoire
peut aider à construire des patrons puissants
avec répétition instantanée. On peut utiliser
\1, \2 etc. pour les sous-chaines matchées.
- v "This is a double double word."
- v s/(\b\w\b) \1/\1/
- print "v\n"
- This is a double word.
- v "This is a triple triple triple word."
- v s/(\b\w\b) \1 \1/\1/
- print "v\n"
- This is a triple word.
55Substitution dexpressions régulières (5)
Voici un exemple plus réaliste (le devoir de
lannée dernière). Vous aurez sûrement besoin
dexplicationsdiscussion en classe.
- Day '01-9120-93011-9'
- Month '01-910121-9'
- Year number up to 31 must have a leading zero
or two. - Year '0-940-9332-94-90-9'
- while(ltgt)
- Find all dates, selecting and reinserting the
context. - 1 and 6 match the context. Superfluous
digits, - as 43 and 55 in 432001-01-2255, belong in the
context. - "Dates" such as April 31 or February 30 are
allowed. - There are no provisions for leap years.
- s/(\D)((Year)-(Month)-(Day))(\D.)/1ltdate
gt2lt\/dategt6/g - s/(\D)((Day)-(Month)-(Year))(\D.)/1ltdate
gt2lt\/dategt6/g - print _
56Substitution dexpressions régulières (6)
On lexécute sur un exemple, juste pour montrer
comment il marche.
- DATA
- Both 12-09-2000 and 25-8-324 are good dates,
- but 30-14-1955 and 10-10-10 are not. OTOH,
10-10-010 is. - RESULTS
- Both ltdategt12-09-2000lt/dategt and
ltdategt25-8-324lt/dategt are good dates, - but 30-14-1955 and 10-10-10 are not. OTOH,
ltdategt10-10-010lt/dategt is.
57Il reste à voir
- Variables prédéfinies
- Plus sur les listes, et haches
- Plus sur les expressions régulières
- Traitement de fichier
- Traitement de répertoires
- Traitement de processus
- Bases de données
- Programmation CGI
58Erreurs fréquentes (1)
- Vient de Programming Perl , page 361.
- Tester dun coup plutôt que de façon
incrémentale. - 2. Ne pas afficher les résultat temporaires pour
vérifier le progrès - 3. Ne pas utiliser le switch -w pour trouver des
erreurs typographiques. - 4. Oublier , _at_ ou devant une variable.
- 5. Oublier le à la fin des lignes.
- 6. Oublier les autours dun bloc.
59Erreurs fréquentes (2)
- (), , , "", '', , ltgt non équilibrés.
- Confusion entre '' et "", ou / et \.
- Utiliser plutôt que eq, ! plutôt que ne,
plutôt que , - ('White' 'Black') et (x 5) sont évalué
comme (0 0) et (5), donc true! - Utiliser "else if" plutôt que "elsif".
- Placer une virgule après le fichier dans une
expression print.
60Erreurs fréquentes (3)
- Ne pas chopper loutput des accents graves
date ou linput - print "Enter y to proceed "
- ans ltSTDINgt
- chop ans
- if (ans eq 'y') print "You said y\n"
- else print "You did not say 'y'\n"
- Oublier que les indexes commencent par 0, et non
1. - Utiliser _, 1, ou dautres variables
prédéfinie, puis modifier le code dune manière
qui les affecte indirectement. - Oublier que les expressions régulières sont
gloutonnes, recherchant le plus long match, et
non le plus court.